CSRF Lab 7
Skills
- SameSite Lax bypass via method override
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Para resolver
este laboratorio
, debemos explotar la vulnerabilidad de CSRF
en la función de cambio de correo electrónico
. Necesitaremos usar el Exploit server
que nos proporcionan para hostear
nuestro ataque
. Podemos iniciar sesión
en nuestra propia cuenta
utilizando las credenciales wiener:peter
. Las restricciones predeterminadas de SameSite
difieren entre navegadores
. Como la víctima
usa Chrome
, se recomienda usar Chrome
o Chromium
para probar el exploit
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 nos dirigimos a la extensión Logger ++
de Burpsuite
vemos que al loguearnos
se nos setea
una cookie
pero no tiene el atributo SameSite
Si nos abrimos
las herramientas de desarrollador
vemos que la cookie
no tiene ese atributo
, por lo tanto si estamos usando Chrome
, se aplicarán las restricciones Lax SameSite por defecto
La diferencia entre un sitio web
y un origen
es su alcance
, un sitio web
abarca varios nombres de dominio
, mientras que un origen
solo incluye uno
. Aunque están estrechamente relacionados, es importante no utilizar los términos indistintamente
, ya que mezclarlos puede tener graves consecuencias para la seguridad
. Se considera que dos URL
tienen el mismo origen
si comparten exactamente el mismo esquema
, nombre de dominio
y puerto
Como podemos ver en este ejemplo
, el término sitio web
es mucho menos específico
, ya que solo tiene en cuenta el esquema
y la última parte
del nombre de dominio
. Fundamentalmente, esto significa que una petición
de origen cruzado (cross-origin)
puede seguir siendo del mismo sitio web
, pero no al revés
. Esta es una distinción importante, ya que significa que cualquier vulnerabilidad
que permita
la ejecución de código JavaScript
puede ser utilizada para eludir
las defensas del sitio web
en otros dominios
que pertenecen al mismo sitio web
Antes de que se introdujera el mecanismo SameSite
, los navegadores enviaban cookies
en cada solicitud al dominio
que las emitía, incluso si la solicitud era originada por un sitio web
de un tercero
que no estáno relacionado
con el sitio web
. SameSite
funciona permitiendo que los navegadores
y los propietarios de sitios web
limiten qué solicitudes entre sitios
, si es que hay alguna, deben incluir ciertas cookies
. Esto puede ayudar a reducir la exposición de los usuarios
a los ataques CSRF
, que inducen al navegador
de la víctima a emitir
una solicitud
que desencadena
una acción perjudicial
en el sitio web vulnerable
. Dado que estas solicitudes generalmente requieren una cookie
asociada con la sesión autenticada
de la víctima, el ataque
fallará si el navegador
no la incluye. Todos los navegadores más importantes actualmente soportan los siguientes niveles de restricción
de SameSite
Strict
- Si unacookie
se establece con el atributoSameSite=Strict
, losnavegadores no la enviarán en ninguna solicitud entre sitios web
. Esto significa quesi el sitio objetivo de la solicitud no coincide con el sitio web que se muestra actualmente en la URL del navegador no se incluirá la cookie
. Esto se recomienda cuando se configurancookies
que permiten al usuariomodificar datos
orealizar acciones sensibles
, comoacceder a páginas
que solo estándisponibles
parausuarios autenticados
Lax
- Las restriccionesSameSite=Lax
significan que losnavegadores
enviarán lacookie
en solicitudes entresitios web
, pero solo sila solicitud utiliza el método GET
y sila solicitud es el resultado de una navegación de nivel superior, es decir, que requiere interacción por parte del usuario
, comohacer click en un enlace
. Esto significa quela cookie no se incluirá en solicitudes POST entre sitios web
, por ejemplo. Dado que las solicitudesPOST
generalmente se utilizan pararealizar acciones
quemodifican datos
o elestado
(al menos según las mejores prácticas), son mucho más propensas a ser el objetivo deataques CSRF
. De igual manera,la cookie no se incluirá en solicitudes en segundo plano
, como aquellas iniciadas porscripts
,iframes
oreferencias a imágenes
y otrosrecursos
None
- Si unacookie
seestablece
con el atributoSameSite=None
, estodesactiva las restricciones SameSite por completo independientemente del navegador
. Como resultado,los navegadores enviarán esta cookie en todas las solicitudes al sitio web que la emitió
,incluso aquellas que fueron originadas por sitios web de terceros no relacionados con el sitio web principal
. Con laexcepción
deChrome
, este es elcomportamiento predeterminado
utilizado por losnavegadores
más famosos si no se proporciona un atributoSameSite
al configurar lacookie
. Existen razones legítimas para deshabilitarSameSite
, como cuando lacookie
está destinada a ser utilizada desde un contexto deterceros
y no otorga alusuario
acceso a datos o funcionalidadessensibles
, un ejemplo, serían lastracking cookies
. Si nos encontramos con unacookie
configurada conSameSite=None
osin restricciones explícitas
,vale la pena investigar si tiene algún propósito
. Cuando el comportamientoLax
fue adoptado porChrome
rompió algunas funcionalidades en las webs. Como solución rápida,algunos sitios web optaron por desactivar las restricciones SameSite en todas las cookies, incluidas las potencialmente sensibles
. Al configurar unacookie
conSameSite=None
, elsitio web
también debeincluir
el atributoSecure
, lo que garantiza que lacookie
solo se enviará en mensajesencriptados
a través deHTTPS
. De lo contrario, losnavegadores
rechazarán lacookie
y `no se seteará
En la práctica, los servidores no siempre son estrictos con respecto a si reciben una solicitud GET o POST en un determinado endpoint
, incluso en aquellos que esperan
el envío
de un formulario
. Si además utilizan restricciones Lax
para sus cookies de sesión
, ya sea de forma explícita o debido al comportamiento predeterminado del navegador
, aún podríamos realizar un ataque CSRF
provocando que el navegador
de la víctima emita una solicitud GET
. Siempre que la solicitud implique una navegación de nivel superior
, es decir, interacción del usuario, el navegador
incluirá la cookie de sesión
de la víctima. Uno de los payloads
más simples para lanzar
el ataque
sería este
1
<script> document.location = 'https://vulnerable-website.com/account/transfer-payment?recipient=hacker&amount=1000000'; </script>
Incluso si no se permite una solicitud GET
ordinaria, algunos frameworks
proporcionan formas de sobrescribir
el método
especificado. Por ejemplo, Symfony
admite el parámetro _method
en formularios
, el cual tiene prioridad sobre el método
normal para propósitos de enrutamiento
. Otros frameworks
admiten una variedad de parámetros
similares para sobrescribir
el método
de la solicitud
1
2
3
4
5
<form action="https://vulnerable-website.com/account/transfer-payment" method="POST">
<input type="hidden" name="_method" value="GET">
<input type="hidden" name="recipient" value="hacker">
<input type="hidden" name="amount" value="1000000">
</form>
Si inspeccionamos
la forma
en la que se envía
el formulario
para cambiar el correo electrónico
, vemos esto
Anteriormente hemos visto que se está utilizando SameSite
con el valor por defecto Lax
, por lo tanto, si conseguimos hacer una petición GET
que sea de navegación superior
, podríamos lograr llevar a cabo un ataque CSRF
. Si capturamos la petición
para cambiar nuestro email
, vemos que se transmite por POST
Si pulsamos click derecho > Change request method
convertimos la petición
a GET
, sin embargo, nos dice que no acepta este método
Como hemos dicho antes algunos frameworks
proporcionan formas de sobrescribir
el método
especificado. Con Symfony
tenemos el método _method
para sobrescribir
el método
de la petición
, por lo tanto, si hacemos una petición
por GET
a /my-account/change-email?email=test%40gmail.com&_method=POST
y sobrescribimos
el método
con _method
la petición
es exitosa
Podemos crear payloads
si tenemos Burpsuite Professional
pulsando click derecho > Engagements tools > Generate CSRF PoC
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 hacer los payloads
de forma manual
1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<form action="https://0a1300120392b3a2822110240029009e.web-security-academy.net/my-account/change-email" method="GET">
<input type="hidden" name="_method" value="POST">
<input type="hidden" name="email" value="pwned@gmail.com">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
Otra alternativa
sería usar este otro payload
1
2
3
4
5
6
7
<html>
<body>
<script>
document.location = 'https://0a1300120392b3a2822110240029009e.web-security-academy.net/my-account/change-email?email=pwned@gmail.com&_method=POST';
</script>
</body>
</html>
Nos abrimos
el Exploit server
y pegamos cualquiera de los payloads
anteriores
Si pulsamos en View exploit
vemos como nos cambia
el email
. Independientemente
del payload
usado, 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