El CSRF (Cross-Site Request Forgery, falsificación de petición entre sitios) engaña al navegador de una víctima autenticada para que envíe una petición no deseada a un sitio donde tiene sesión abierta. El navegador adjunta automáticamente la cookie de sesión, y el servidor cree que la acción la pidió el usuario legítimo.
Condiciones para que funcione
- La víctima tiene una sesión activa en el sitio objetivo.
- La acción se identifica solo por datos que el navegador envía solo (cookies).
- No hay un valor impredecible que el atacante no pueda conocer.
Cómo se entrega
<!-- En una web maliciosa: el formulario se autoenvía -->
<form action="https://banco.com/transferir" method="POST" id="x">
<input type="hidden" name="destino" value="atacante">
<input type="hidden" name="monto" value="1000">
</form>
<script>document.getElementById('x').submit()</script>
La víctima solo visita la página; la petición sale con su cookie de banco.com.
Las defensas
Token anti-CSRF (sincronizador): un valor secreto, único por sesión, que el sitio incluye en cada formulario y verifica al recibir la petición. La web atacante no puede leerlo ni adivinarlo.
Complementos:
- Cookies
SameSite=LaxoStrict: el navegador no envía la cookie en peticiones originadas en otro sitio. - Re-autenticación en acciones sensibles (pedir contraseña al transferir).
- Verificar cabeceras
Origin/Refereren el servidor.
Nota: el CSRF abusa de acciones que cambian estado (POST). No confundir con XSS: el XSS ejecuta código en la página; el CSRF solo dispara una petición desde fuera.
El CSRF hace que la víctima dispare una petición. La siguiente falla hace que el servidor dispare peticiones por el atacante, o que reconstruya objetos peligrosos: SSRF y deserialización, el próximo tema.