CSRF: qué es, cuándo es explotable y cómo se evita
Guía en castellano sobre cross-site request forgery (CSRF): cómo funciona, por qué SameSite no lo resuelve todo, cómo se prueba en bug bounty y cómo se corrige.
Qué es
En un CSRF (Cross-Site Request Forgery) una web maliciosa hace que tu navegador envíe una petición a otra web en la que tienes la sesión abierta. Como el navegador adjunta tus cookies automáticamente, la web atacada cree que la petición la has hecho tú: cambiar el correo, transferir dinero o borrar algo.
Para que funcione hacen falta tres cosas: una acción interesante, que la sesión dependa solo de cookies y que la petición no lleve nada que el atacante no pueda adivinar.
Dónde suele aparecer
- Cambios de correo, contraseña o datos de recuperación (la puerta a tomar la cuenta).
- Acciones con
GETque modifican datos, que se pueden lanzar hasta con una imagen. - Endpoints que aceptan el mismo dato como formulario aunque la aplicación envíe JSON.
- Inicio de sesión y vinculación de cuentas, donde el ataque te mete en la cuenta del atacante.
Cómo se prueba
- Busca acciones que cambien el estado y mira qué protección llevan: un token en el formulario, una cabecera personalizada o nada.
- Quita el token, déjalo vacío o pon el de otra sesión, y comprueba si la acción se ejecuta igual.
- Prueba a cambiar el método (
POSTaGET) o el tipo de contenido (JSON a formulario). - Revisa el atributo
SameSitede las cookies: conLax(valor por defecto en muchos navegadores) la mayoría de peticionesPOSTdesde otra web ya no llevan cookies, pero lasGETde navegación sí. - Prepara una página HTML mínima que envíe la petición y ábrela con tu propia sesión.
Cómo se evita
- Un token aleatorio por sesión en cada formulario o petición que modifique datos, comprobado en el servidor.
- Cookies de sesión con
SameSite=LaxoStrictcomo protección adicional. - Comprobar las cabeceras
OriginoSec-Fetch-Siteen las peticiones que cambian algo. - No modificar nunca datos en respuestas a
GET.
Al reportarlo
Incluye la página de prueba y explica el efecto real. Los programas suelen descartar CSRF en acciones sin impacto (por ejemplo, cerrar sesión), así que céntrate en las que cambian algo importante.