Grunt's personal blog

this is my personal blog for my hacking stuff, my degree stuff, etc

View on GitHub

BSCP PRACTICIONER Lab 2: OAuth account hijacking via redirect_uri

TBD LAB

Estudiando OAuth 2.0


alt text


¿Que es OAuth?

Como funciona


Existen numerosas formas diferentes en las que se puede implementar el proceso de OAuth. Estas se conocen como “flujos” o “tipos de concesión” de OAuth. En este tema, nos centraremos en los tipos de concesión “código de autorización” e “implícito”, ya que son, con mucho, los más comunes. En términos generales, ambos tipos de concesión implican las siguientes etapas:

  1. La aplicación cliente solicita acceso a un subconjunto de los datos del usuario, especificando qué tipo de concesión desea usar y qué tipo de acceso necesita.
  2. Se solicita al usuario que inicie sesión en el servicio OAuth y otorgue explícitamente su consentimiento para el acceso solicitado.
  3. La aplicación cliente recibe un token de acceso único que demuestra que tiene permiso del usuario para acceder a los datos solicitados. La forma exacta en que esto ocurre varía significativamente según el tipo de concesión.
  4. La aplicación cliente utiliza este token de acceso para realizar llamadas a la API y obtener los datos relevantes del servidor de recursos.

OAuth grant types

El tipo de concesión de OAuth determina la secuencia exacta de pasos que están involucrados en el proceso de OAuth. El tipo de concesión también afecta cómo la aplicación cliente se comunica con el servicio OAuth en cada etapa, incluyendo cómo se envía el propio token de acceso. Por esta razón, los tipos de concesión a menudo se denominan “flujos de OAuth”.

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

Existen varios tipos de concesión diferentes, cada uno con distintos niveles de complejidad y consideraciones de seguridad. Nos centraremos en los tipos de concesión “código de autorización” e “implícito”, ya que son, con mucho, los más comunes.

OAuth Scopes

Para cualquier tipo de concesión de OAuth, la aplicación cliente debe especificar qué datos desea acceder y qué tipo de operaciones desea realizar. Esto se hace utilizando el parámetro scope en la solicitud de autorización que envía al servicio OAuth.

Para el OAuth básico, los alcances (scopes) a los que una aplicación cliente puede solicitar acceso son únicos para cada servicio OAuth. Dado que el nombre del alcance es simplemente una cadena de texto arbitraria, el formato puede variar drásticamente entre los proveedores. Algunos incluso utilizan un URI completo como nombre del alcance, similar a un endpoint de una API REST. Por ejemplo, al solicitar acceso de solo lectura a la lista de contactos de un usuario, el nombre del alcance podría tomar cualquiera de las siguientes formas dependiendo del servicio OAuth que se esté utilizando:


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

Cuando OAuth se utiliza para autenticación, sin embargo, a menudo se emplean los alcances estandarizados de OpenID Connect.
Por ejemplo, el alcance openid profile otorgará a la aplicación cliente acceso de solo lectura a un conjunto predefinido de información básica sobre el usuario, como su dirección de correo electrónico, nombre de usuario, entre otros. Hablaremos más sobre OpenID Connect más adelante.

Authorization code grant type

El tipo de concesión de código de autorización inicialmente parece bastante complicado, pero en realidad es más simple de lo que piensas una vez que te familiarizas 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 pide al usuario que consienta el acceso solicitado. Si acepta, a la aplicación cliente se le otorga un “código de autorización”. La aplicación cliente luego intercambia este código con el servicio OAuth para recibir un “token de acceso”, que puede usar para realizar llamadas a la API y obtener los datos relevantes del usuario.

Toda la comunicación que ocurre desde el intercambio de código/token en adelante se envía de servidor a servidor a través de un canal 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 con el servicio OAuth. En este momento, también se genera un client_secret, que la aplicación cliente debe usar para autenticarse al enviar estas solicitudes de servidor a servidor.

Dado que los datos más sensibles (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. Las aplicaciones del lado del servidor deberían idealmente usar siempre este tipo de concesión si es posible.


alt text