CSRF Lab 4
Skills
- CSRF where token is not tied to user session
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio
es vulnerable
a un ataque de CSRF
en la funcionalidad
de cambio de correo electrónico
. Utiliza tokens
para intentar prevenir ataques CSRF
, pero estos no están integrados en el sistema de gestión de sesiones
del sitio web. Para resolver
el laboratorio
, debemos utilizar nuestro servidor de explotación
para alojar un documento HTML
que lleve a cabo un ataque CSRF
y cambie
la dirección de correo electrónico
de la cuenta del usuario víctima. Las credenciales para las dos cuentas en la aplicación son wiener:peter
y carlos:montoya
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
Para resolver
el laboratorio
, debemos explotar
un CSRF
, el cual es una vulnerabilidad
de seguridad web
que permite a un atacante
inducir a los usuarios
a realizar acciones
que no tienen intención
de realizar. Permite a un atacante
eludir parcialmente la política
de same origin
, que está diseñada para evitar que diferentes sitios web
interfieran entre sí. Para que sea posible un ataque CSRF
, deben cumplirse tres condiciones clave
Una acción relevante
- Hay unaacción
dentro de laaplicación
que elatacante
tienemotivos
parainducir
. Puede ser unaacción privilegiada
(comomodificar
lospermisos
de otrosusuarios
) o cualquieracción
sobredatos específicos
delusuario
(comocambiar
lacontraseña
delusuario
)Manejo de sesiones basado en cookies
- Pararealizar
laacción
, se debenemitir
una o mássolicitudes HTTP
, y laaplicación
se basa únicamente en lascookies de sesión
paraidentificar
alusuario
que realizó lassolicitudes
. No existe ningún otromecanismo
pararealizar
elseguimiento
de lassesiones
ovalidar
lassolicitudes
de losusuarios
Sin parámetros de solicitud impredecibles
- Lassolicitudes
que realizan laacción
no contienen ningúnparámetro
cuyosvalores
elatacante
no puedadeterminar
oadivinar
. Por ejemplo, alhacer
que unusuario
cambie sucontraseña
, lafunción
no esvulnerable
si unatacante
necesitasaber
elvalor
de lacontraseña existente
Las defensas
más comunes
contra ataques CSRF
con las que nos podemos encontrar son las siguientes
Token CSRF
- Es untoken
único, secreto e impredecible generado por elservidor
ycompartido
con elcliente
. Para realizar unaacción sensible
, comoenviar
unformulario
, elcliente
debe incluir estetoken
. Esto dificulta que unatacante
generesolicitudes
válidas en nombre de lavíctima
Cookies SameSite
-SameSite
es unmecanismo
deseguridad
delnavegador
queregula cuándo se incluyen las cookies en las solicitudes de otros sitios web
. Dado que lassolicitudes
para realizaracciones sensibles
suelen requerir unacookie válida
, es decir, unacookie
que haya sido asignada tras unaautenticación válida
, lasrestricciones
que aplicaSameSite
pueden impedir que unatacante
desencadene estasacciones
. Desde 2021,Chrome aplica por defecto las restricciones Lax SameSite
, dado que este es elestándar
, se espera que otrosnavegadores
también loadopten
Validación basada en Referer
- Algunasaplicaciones
hacen uso de lacabecera HTTP Referer
para intentardefenderse
deataques CSRF
, normalmenteverificando
que lapetición
seoriginó
en el propiodominio
de laweb
. Esto suele ser menos efectivo que lavalidación
detokens CSRF
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 nos fijamos en la petición
de cambiar email
, vemos que cumple estas tres condiciones
para ser vulnerable
pero que también se está transmitiendo un token CSRF
que es el mismo que aparece en la web
Algunas aplicaciones
no validan
que el token
pertenezca a la misma sesión
que el usuario
que realiza la solicitud
. En su lugar, la aplicación
mantiene un grupo global de tokens
que ha emitido
y acepta
cualquier token
que aparezca en este grupo
. En esta situación, el atacante
puede iniciar sesión
en la aplicación
usando su propia cuenta
, obtener
un token válido
y luego pasar
ese token
al usuario víctima
en su ataque CSRF
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. Hay que tener en cuenta que mientras ningún usuario genere otro token CSRF, este token será válido
1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<form action="https://0a6500f904650a4680ddbca6009700a1.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="pwned@gmail.com">
<input type="hidden" name="csrf" value="lpY2pJrIdkX2jPz0XXskpWJor3B67YyS">
</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