CSRF where token validation depends on token being present
Laboratorio de Portswigger sobre CSRF
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio
tiene una funcionalidad de cambio de correo electrónico
vulnerable a CSRF
. Para resolver
el laboratorio
, debemos usar nuestro servidor de explotación
para alojar una documento HTML
que lleve a cabo un ataque CSRF
para cambiar
la dirección de correo electrónico
del usuario que reciba el payload
. Podemos iniciar sesión
en nuestra propia cuenta utilizando las credenciales wiener:peter
Guía de CSRF
Antes
de completar
este laboratorio
es recomendable leerse
esta guía de CSRF
https://justice-reaper.github.io/posts/CSRF-Guide/
Resolución
Al acceder
a la web
vemos esto
Pulsamos sobre My account
y nos logueamos
con las credenciales wiener:peter
Vemos que hay un botón
para cambiar
el email
Si capturamos
la petición
de cambiar email
con Burpsuite
, vemos esto
Algunas aplicaciones
validan correctamente el token
cuando está presente, pero omiten
la validación
si se omite
el token
. En esta situación, el atacante
puede eliminar todo el parámetro
que contiene el token
(no solo su valor
) para eludir la validación
y lanzar un ataque CSRF
. Vemos que al eliminar
el parámetro csrf
omitimos la validación
y por lo tanto podemos modificar
nuestro email
Si inspeccionamos
el código
, vemos cómo se envía
el formulario
. Podemos usar
este formulario como modelo
para construir
nuestro propio payload
Si contamos Burpsuite Professional
podemos capturar
una petición
y pulsar click derecho > Engagement tools > Generate CSRF PoC
para que nos genere
un payload
Se nos genera este payload
, aunque es funcional, en la mayoría de ocasiones vamos a tener que retocarlo
un poco para mejorar
su desempeño
En mi caso prefiero construir
los payloads
de forma manual
, para comprobar
que funciona
nos dirigimos al Exploit server
y lo pegamos
1
2
3
4
5
6
7
8
9
10
<html>
<body>
<form action="https://0aef003a04fed832802f26d100f900ee.web-security-academy.net/my-account/change-email" method=POST>
<input type="hidden" name="email" value="pwned@gmail.com">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
Una vez hecho esto pulsamos sobre View exploit
para ver si nos cambia
el email
a nosotros y efectivamente
nos lo cambia
. Independientemente de como generemos el payload, para completar
el laboratorio
debemos pegarlo en el Exploit server
y pulsar sobre Delivery exploit to victim
. Debemos tener en cuenta que dos usuarios no pueden tener el mismo email
, por lo tanto, debemos cambiar nuestro email o cambiar el email en el payload que enviamos