Entrada

CSRF where token is not tied to user session

Laboratorio de Portswigger sobre CSRF

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


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 inspeccionamos el código, vemos cómo se envía el formulario. Podemos usar este formulario como modelo para construir nuestro propio payload

Si capturamos la petición de cambiar email con Burpsuite, vemos que 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

Esta entrada está licenciada bajo CC BY 4.0 por el autor.