JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • ¿Qué es OAuth?
  • Nota
  • 1. Tipos de Concesión Auth0 →
  • Ámbitos de OAuth - Scope parámetro:
  • 1.2 Tipo de Concesión Auth0 Authorization:
  • Paso a paso:
  • 1.3 Tipo de Concesión Auth0 Implicit:
  1. PortSwigger WebAcademy
  2. Advanced Topics

0Auth

OAuth 2.0 authentication vulnerabilities

PreviousAdvanced TopicsNextInsecure Deserialization

Last updated 7 months ago

Mientras navegas por la web, es casi seguro que te has encontrado con sitios que te permiten iniciar sesión con tu cuenta de redes sociales. Lo más probable es que esta función esté diseñada con el popular marco OAuth 2.0. OAuth 2.0 es muy interesante para los atacantes porque es extremadamente común y, por naturaleza, propenso a errores de implementación. Esto puede generar una serie de vulnerabilidades, lo que permite a los atacantes obtener datos confidenciales de los usuarios y, potencialmente, eludir la autenticación por completo.

En esta sección, le enseñaremos a identificar y explotar algunas de las vulnerabilidades clave que se encuentran en los mecanismos de autenticación de OAuth 2.0. No se preocupe si no está muy familiarizado con la autenticación de OAuth: le proporcionamos mucha información de fondo para ayudarlo a comprender los conceptos clave que necesitará. También exploraremos algunas vulnerabilidades en la extensión OpenID Connect de OAuth . Por último, incluimos algunas pautas sobre cómo proteger sus propias aplicaciones contra este tipo de ataques.

¿Qué es OAuth?

OAuth es un marco de autorización de uso común que permite a los sitios web y las aplicaciones web solicitar acceso limitado a la cuenta de un usuario en otra aplicación. Fundamentalmente, OAuth permite al usuario otorgar este acceso sin exponer sus credenciales de inicio de sesión a la aplicación solicitante. Esto significa que los usuarios pueden definir con precisión qué datos desean compartir en lugar de tener que entregar el control total de su cuenta a un tercero.

El proceso básico de OAuth se utiliza ampliamente para integrar funciones de terceros que requieren acceso a determinados datos de la cuenta de un usuario. Por ejemplo, una aplicación puede utilizar OAuth para solicitar acceso a su lista de contactos de correo electrónico para poder sugerir personas con las que conectarse. Sin embargo, el mismo mecanismo también se utiliza para proporcionar servicios de autenticación de terceros, lo que permite a los usuarios iniciar sesión con una cuenta que tienen en un sitio web diferente.

Nota

Aunque OAuth 2.0 es el estándar actual, algunos sitios web aún utilizan la versión 1a anterior. OAuth 2.0 se escribió desde cero en lugar de desarrollarse directamente a partir de OAuth 1.0. Como resultado, ambos son muy diferentes. Tenga en cuenta que el término "OAuth" se refiere exclusivamente a OAuth 2.0 en este material.

1. Tipos de Concesión Auth0 →

  • El tipo de concesión de OAuth determina la secuencia exacta de pasos que intervienen en el proceso de OAuth. El tipo de concesión también afecta la forma en que la aplicación cliente se comunica con el servicio de OAuth en cada etapa, incluida la forma en que se envía el token de acceso. Por este motivo, los tipos de concesión suelen denominarse "flujos de OAuth".

    Un servicio OAuth debe configurarse para admitir un tipo de concesión en particular antes de que una aplicación cliente pueda iniciar el flujo correspondiente. La aplicación cliente especifica qué tipo de concesión desea utilizar en la solicitud de autorización inicial que envía al servicio OAuth.

Para este caso nos centraremos en los dos tipos de concesión o “Flujo de Oauth” → Authorization e Implicit que son los más comunes.

Ámbitos de OAuth - Scope parámetro:

  • Para cualquier tipo de concesión de OAuth, la aplicación cliente debe especificar a qué datos desea acceder y qué tipo de operaciones desea realizar. Para ello, utiliza el scopeparámetro de la solicitud de autorización que envía al servicio OAuth.

    En el caso de OAuth básico, los ámbitos para los que una aplicación cliente puede solicitar acceso son exclusivos de cada servicio OAuth. Como el nombre del ámbito es simplemente una cadena de texto arbitraria, el formato puede variar drásticamente entre proveedores. Algunos incluso utilizan una URI completa como nombre del ámbito, de forma similar a un punto final de API REST. Por ejemplo, al solicitar acceso de lectura a la lista de contactos de un usuario, el nombre del ámbito puede adoptar cualquiera de las siguientes formas según el servicio OAuth que se utilice:

scope=contacts
scope=contacts.read
scope=contact-list-r
scope=https://oauth-authorization-server.com/auth/scopes/user/contacts.rea    only

Sin embargo, cuando se utiliza OAuth para la autenticación, se suelen utilizar los ámbitos estandarizados de OpenID Connect. Por ejemplo, el ámbito openid profile otorgará a la aplicación cliente acceso de lectura a un conjunto predefinido de información básica sobre el usuario, como su dirección de correo electrónico, nombre de usuario, etc. Hablaremos más sobre OpenID Connect más adelante.

1.2 Tipo de Concesión Auth0 Authorization:

  • El tipo de concesión del código de autorización inicialmente parece bastante complicado, pero en realidad es más simple de lo que piensa una vez que está familiarizado con algunos conceptos básicos.

    En resumen, la aplicación cliente y el servicio OAuth primero utilizan redirecciones para intercambiar una serie de solicitudes HTTP basadas en el navegador que inician el flujo. Se le pregunta al usuario si acepta el acceso solicitado. Si acepta, se le otorga a la aplicación cliente un "código de autorización". Luego, la aplicación cliente intercambia este código con el servicio OAuth para recibir un "token de acceso", que puede usar para realizar llamadas API para obtener los datos de usuario relevantes.

    Toda la comunicación que se produce desde el intercambio de código/token en adelante se envía de servidor a servidor a través de un canal de retorno seguro y preconfigurado y, por lo tanto, es invisible para el usuario final. Este canal seguro se establece cuando la aplicación cliente se registra por primera vez en el servicio OAuth. En ese momento, client_secrettambién se genera un correo electrónico que la aplicación cliente debe utilizar para autenticarse al enviar estas solicitudes de servidor a servidor.

    Como los datos más confidenciales (el token de acceso y los datos del usuario) no se envían a través del navegador, este tipo de concesión es posiblemente el más seguro. Lo ideal es que las aplicaciones del lado del servidor siempre utilicen este tipo de concesión si es posible.

Paso a paso:

1. Solicitud de autorización

La aplicación cliente envía una solicitud al punto final del servicio OAuth /authorizationsolicitando permiso para acceder a datos específicos del usuario. Tenga en cuenta que la asignación del punto final puede variar entre proveedores: nuestros laboratorios utilizan el punto final /authpara este propósito. Sin embargo, siempre debería poder identificar el punto final en función de los parámetros utilizados en la solicitud.

GET /authorization?client_id=12345&redirect_uri=https://client-app.com/callback&response_type=code&scope=openid%20profile&state=ae13d489bd00e3c24 HTTP/1.1
Host: oauth-authorization-server.com

Esta solicitud contiene los siguientes parámetros importantes, generalmente proporcionados en la cadena de consulta:

  • client_id

    Parámetro obligatorio que contiene el identificador único de la aplicación cliente. Este valor se genera cuando la aplicación cliente se registra en el servicio OAuth.

  • redirect_uri

    La URI a la que se debe redirigir el navegador del usuario al enviar el código de autorización a la aplicación cliente. También se conoce como "URI de devolución de llamada" o "punto final de devolución de llamada". Muchos ataques OAuth se basan en explotar fallas en la validación de este parámetro.

  • response_type

    Determina qué tipo de respuesta espera la aplicación cliente y, por lo tanto, qué flujo desea iniciar. Para el tipo de concesión de código de autorización, el valor debe ser code.

  • scope

    Se utiliza para especificar a qué subconjunto de los datos del usuario desea acceder la aplicación cliente. Tenga en cuenta que estos pueden ser ámbitos personalizados establecidos por el proveedor de OAuth o ámbitos estandarizados definidos por la especificación de OpenID Connect. Trataremos OpenID Connect con más detalle más adelante.

  • state

    Almacena un valor único e indescifrable que está vinculado a la sesión actual en la aplicación cliente. El servicio OAuth debe devolver este valor exacto en la respuesta, junto con el código de autorización. Este parámetro funciona como una forma de token CSRF para la aplicación cliente, ya que garantiza que la solicitud a su /callbackpunto final provenga de la misma persona que inició el flujo OAuth.

2. Inicio de sesión y consentimiento del usuario

Cuando el servidor de autorización recibe la solicitud inicial, redirigirá al usuario a una página de inicio de sesión, donde se le solicitará que inicie sesión en su cuenta con el proveedor de OAuth. Por ejemplo, esta suele ser su cuenta de redes sociales.

A continuación, se les presentará una lista de datos a los que la aplicación cliente desea acceder, en función de los alcances definidos en la solicitud de autorización. El usuario puede elegir si desea o no dar su consentimiento para este acceso.

Es importante tener en cuenta que una vez que el usuario haya aprobado un alcance determinado para una aplicación cliente, este paso se completará automáticamente siempre que el usuario aún tenga una sesión válida con el servicio OAuth. En otras palabras, la primera vez que el usuario seleccione "Iniciar sesión con redes sociales", deberá iniciar sesión manualmente y dar su consentimiento, pero si vuelve a visitar la aplicación cliente más tarde, a menudo podrá volver a iniciar sesión con un solo clic.

3. Concesión del código de autorización

Si el usuario consiente el acceso solicitado, su navegador será redirigido al /callbackpunto final que se especificó en el redirect_uriparámetro de la solicitud de autorización. La GETsolicitud resultante contendrá el código de autorización como parámetro de consulta. Dependiendo de la configuración, también podrá enviar el stateparámetro con el mismo valor que en la solicitud de autorización.

GET /callback?code=a1b2c3d4e5f6g7h8&state=ae13d489bd00e3c24 HTTP/1.1
Host: client-app.com

4. Solicitud de token de acceso

Una vez que la aplicación cliente recibe el código de autorización, debe intercambiarlo por un token de acceso. Para ello, envía una POSTsolicitud de servidor a servidor al punto final del servicio OAuth /token. Toda la comunicación a partir de este momento se lleva a cabo en un canal de retorno seguro y, por lo tanto, normalmente no puede ser observada ni controlada por un atacante.

POST /token HTTP/1.1
Host: oauth-authorization-server.com
…
client_id=12345&client_secret=SECRET&redirect_uri=https://client-app.com/callback&grant_type=authorization_code&code=a1b2c3d4e5f6g7h8

Además de la client_idautorización y code, notarás los siguientes parámetros nuevos:

  • client_secret

    La aplicación cliente debe autenticarse incluyendo la clave secreta que se le asignó al registrarse en el servicio OAuth.

  • grant_type

    Se utiliza para garantizar que el nuevo punto final sepa qué tipo de concesión desea utilizar la aplicación cliente. En este caso, debe configurarse en authorization_code.

5. Concesión de token de acceso

El servicio OAuth validará la solicitud de token de acceso. Si todo es como se espera, el servidor responde otorgando a la aplicación cliente un token de acceso con el alcance solicitado.

{
    "access_token": "z0y9x8w7v6u5",
    "token_type": "Bearer",
    "expires_in": 3600,
    "scope": "openid profile",
    …
}

6. Llamada API

Ahora que la aplicación cliente tiene el código de acceso, puede finalmente obtener los datos del usuario del servidor de recursos. Para ello, realiza una llamada API al /userinfopunto final del servicio OAuth. El token de acceso se envía en el Authorization: Bearerencabezado para demostrar que la aplicación cliente tiene permiso para acceder a estos datos.

GET /userinfo HTTP/1.1
Host: oauth-resource-server.com
Authorization: Bearer z0y9x8w7v6u5

7. Subvención de recursos

El servidor de recursos debe verificar que el token sea válido y que pertenezca a la aplicación cliente actual. De ser así, responderá enviando el recurso solicitado, es decir, los datos del usuario en función del alcance del token de acceso.

{
    "username":"carlos",
    "email":"carlos@carlos-montoya.net",
    …
}

La aplicación cliente puede finalmente utilizar estos datos para el propósito previsto. En el caso de la autenticación OAuth, normalmente se utilizarán como ID para otorgarle al usuario una sesión autenticada, lo que le permitirá iniciar sesión de manera efectiva.


1.3 Tipo de Concesión Auth0 Implicit:

El tipo de concesión implícita es mucho más simple. En lugar de obtener primero un código de autorización y luego intercambiarlo por un token de acceso, la aplicación cliente recibe el token de acceso inmediatamente después de que el usuario da su consentimiento.

Quizás te preguntes por qué las aplicaciones cliente no siempre utilizan el tipo de concesión implícita. La respuesta es relativamente sencilla: es mucho menos seguro. Cuando se utiliza el tipo de concesión implícita, toda la comunicación se realiza a través de redirecciones del navegador; no hay un canal de retorno seguro como en el flujo del código de autorización. Esto significa que el token de acceso confidencial y los datos del usuario están más expuestos a posibles ataques.

El tipo de concesión implícita es más adecuado para aplicaciones de página única y aplicaciones de escritorio nativas, que no pueden almacenar fácilmente client_secreten el back-end y, por lo tanto, no se benefician tanto del uso del tipo de concesión de código de autorización.

1. Solicitud de autorización

El flujo implícito comienza de forma muy similar al flujo del código de autorización. La única diferencia importante es que el response_typeparámetro debe configurarse en token.

GET /authorization?client_id=12345&redirect_uri=https://client-app.com/callback&response_type=token&scope=openid%20profile&state=ae13d489bd00e3c24 HTTP/1.1
Host: oauth-authorization-server.com

2. Inicio de sesión y consentimiento del usuario

El usuario inicia sesión y decide si acepta o no los permisos solicitados. Este proceso es exactamente el mismo que el del flujo del código de autorización.

3. Concesión de token de acceso

Si el usuario da su consentimiento para el acceso solicitado, las cosas empiezan a cambiar. El servicio OAuth redirigirá el navegador del usuario a la dirección redirect_uriespecificada en la solicitud de autorización. Sin embargo, en lugar de enviar un parámetro de consulta que contenga un código de autorización, enviará el token de acceso y otros datos específicos del token como un fragmento de URL.

GET /callback#access_token=z0y9x8w7v6u5&token_type=Bearer&expires_in=5000&scope=openid%20profile&state=ae13d489bd00e3c24 HTTP/1.1
Host: client-app.com

Como el token de acceso se envía en un fragmento de URL, nunca se envía directamente a la aplicación cliente. En su lugar, la aplicación cliente debe utilizar un script adecuado para extraer el fragmento y almacenarlo.

4. Llamada API

Una vez que la aplicación cliente ha extraído correctamente el token de acceso del fragmento de URL, puede usarlo para realizar llamadas API al /userinfopunto final del servicio OAuth. A diferencia del flujo de código de autorización, esto también sucede a través del navegador.

GET /userinfo HTTP/1.1
Host: oauth-resource-server.com
Authorization: Bearer z0y9x8w7v6u5

5. Subvención de recursos

El servidor de recursos debe verificar que el token sea válido y que pertenezca a la aplicación cliente actual. De ser así, responderá enviando el recurso solicitado, es decir, los datos del usuario en función del alcance asociado al token de acceso.

{
    "username":"carlos",
    "email":"carlos@carlos-montoya.net"
}

La aplicación cliente puede finalmente utilizar estos datos para el propósito previsto. En el caso de la autenticación OAuth, normalmente se utilizarán como ID para otorgarle al usuario una sesión autenticada, lo que le permitirá iniciar sesión de manera efectiva.


Autenticación OAuth

Aunque en un principio no estaba pensado para este fin, OAuth ha evolucionado hasta convertirse también en un medio para autenticar a los usuarios. Por ejemplo, probablemente conozca la opción que ofrecen muchos sitios web para iniciar sesión con su cuenta de redes sociales existente en lugar de tener que registrarse en el sitio web en cuestión. Siempre que vea esta opción, es muy probable que esté basada en OAuth 2.0.

En el caso de los mecanismos de autenticación OAuth, los flujos básicos de OAuth siguen siendo en gran medida los mismos; la principal diferencia es cómo la aplicación cliente utiliza los datos que recibe. Desde la perspectiva del usuario final, el resultado de la autenticación OAuth es algo que se parece mucho al inicio de sesión único (SSO) basado en SAML. En estos materiales, nos centraremos exclusivamente en las vulnerabilidades de este caso de uso similar al SSO.

La autenticación OAuth generalmente se implementa de la siguiente manera:

  1. El usuario elige la opción de iniciar sesión con su cuenta de redes sociales. A continuación, la aplicación cliente utiliza el servicio OAuth del sitio de redes sociales para solicitar acceso a algunos datos que puede utilizar para identificar al usuario. Esta podría ser, por ejemplo, la dirección de correo electrónico registrada en su cuenta.

  2. Después de recibir un token de acceso, la aplicación cliente solicita estos datos al servidor de recursos, generalmente desde un /userinfo

    punto final dedicado.

  3. Una vez que recibe los datos, la aplicación cliente los utiliza en lugar de un nombre de usuario para iniciar la sesión del usuario. El token de acceso que recibió del servidor de autorización a menudo se utiliza en lugar de una contraseña tradicional.


Vamos a ver esto en más detalle con un simple laboratorio (el primero), para entender de que se trata:

Puede ver un ejemplo simple de cómo se ve esto en el siguiente laboratorio. Simplemente complete la opción "Iniciar sesión con redes sociales" mientras envía tráfico a través de Burp y luego estudie la serie de interacciones de OAuth en el historial del proxy. Puede iniciar sesión con las credenciales wiener:peter. Tenga en cuenta que esta implementación es deliberadamente vulnerable; le enseñaremos cómo aprovechar esto más adelante.

Pequeño diagrama de como funciona Auth0