Seguridad web

CSRF (Cross-Site Request Forgery)

Se lee en aproximadamente 3 minutos

Qué es CSRF (Cross-Site Request Forgery)

CSRF (Cross-Site Request Forgery) es una técnica de ataque que hace que el navegador del usuario envíe solicitudes no intencionadas a un sitio web donde el usuario está autenticado. El atacante prepara una página web o correo trampa, y en el momento en que la víctima lo visualiza, se envía automáticamente una solicitud fraudulenta desde el navegador de la víctima al sitio objetivo.

El navegador adjunta automáticamente las cookies a las solicitudes al mismo dominio, por lo que si la víctima ha iniciado sesión, la solicitud del atacante también se procesa como autenticada. Las operaciones que modifican el estado, como cambios de contraseña, transferencias, cambios de dirección de correo y compras, son los objetivos del ataque.

Funcionamiento del ataque y ejemplos concretos

Los ataques CSRF se ejecutan siguiendo este flujo.

  1. La víctima inicia sesión en el sitio objetivo (por ejemplo, banca en línea) y la cookie de sesión se almacena en el navegador.
  2. La víctima visualiza la página trampa preparada por el atacante (enlace en correo, publicación en foro, etc.).
  3. El HTML o JavaScript incrustado en la página trampa envía una solicitud desde el navegador de la víctima al sitio objetivo.
  4. El navegador adjunta automáticamente la cookie de sesión, por lo que el sitio objetivo la procesa como una solicitud legítima.

Por ejemplo, si la función de transferencia opera con una solicitud como POST /transfer?to=attacker&amount=100000, el atacante solo necesita incrustar un formulario de envío automático en la página trampa para ejecutar una transferencia desde la cuenta de la víctima.

Se confunde fácilmente con XSS, pero CSRF no ejecuta el script del atacante en el navegador de la víctima, sino que falsifica solicitudes legítimas desde el navegador de la víctima, lo cual es fundamentalmente diferente.

Implementación de medidas de defensa

El núcleo de las medidas contra CSRF es implementar un mecanismo que verifique que la solicitud se basa en la intención del usuario legítimo.

Token CSRF

El servidor genera un token aleatorio al mostrar el formulario y lo incrusta en un campo hidden. Al enviar el formulario, se verifica la coincidencia del token, rechazando las solicitudes falsificadas desde sitios externos. El token es único por sesión y el atacante no puede conocer el token de la víctima.

Atributo SameSite de cookies

Configurando el atributo SameSite de las cookies, se puede controlar la adjunción de cookies en solicitudes cross-site.

  • SameSite=Strict: No adjunta cookies en ninguna solicitud desde sitios externos. Es lo más seguro, pero el estado de sesión no se mantiene al acceder desde enlaces externos.
  • SameSite=Lax: Solo adjunta cookies en solicitudes GET de navegación de nivel superior (clics en enlaces). No se adjuntan en solicitudes POST, por lo que puede prevenir muchos ataques CSRF.
  • SameSite=None: Adjunta cookies también en solicitudes cross-site. Requiere combinarse con el atributo Secure.

Otras medidas

  • Verificación de encabezados Origin / Referer: Confirmar que el origen de la solicitud es el propio sitio. Sin embargo, el Referer puede no enviarse debido a configuraciones de privacidad o proxies.
  • Requerimiento de encabezados personalizados: Requerir encabezados personalizados como X-Requested-With. Debido a la política de mismo origen del navegador, agregar encabezados personalizados a solicitudes cross-site requiere un preflight de CORS, lo que previene CSRF.
  • Configuración adecuada de encabezados de seguridad: Fortalecer la postura de seguridad general.

Medidas CSRF en frameworks modernos

Muchos frameworks web modernos proporcionan protección CSRF integrada.

  • Django: Incrusta automáticamente el token con la etiqueta de plantilla {% csrf_token %} y lo verifica con middleware.
  • Ruby on Rails: Genera y verifica automáticamente tokens CSRF con protect_from_forgery.
  • Spring Security: La protección CSRF está habilitada por defecto. Inserta automáticamente CsrfToken en los formularios.
  • Next.js / SPA: En las rutas API, combinar cookies SameSite con verificación del encabezado Origin. También considerar protección adicional con WAF.

Si desactiva la protección CSRF del framework, verifique que las medidas alternativas estén implementadas de forma segura. Si excluye la protección CSRF en endpoints API, la premisa es cambiar a autenticación por token (Bearer Token) y no usar autenticación basada en cookies.

Conceptos erróneos comunes

CSRF no ocurre con solicitudes GET
Si se implementan operaciones que modifican el estado (eliminación, cambio de configuración, etc.) con solicitudes GET, también son objetivo de CSRF. Se puede enviar una solicitud GET simplemente configurando una URL en el atributo src de una etiqueta img, por lo que los cambios de estado deben implementarse siempre con POST/PUT/DELETE.
Si se usa HTTPS, se puede prevenir CSRF
HTTPS proporciona cifrado de comunicación y prevención de alteración, pero no tiene relación con CSRF. CSRF es un ataque que envía solicitudes legítimas desde el navegador del usuario legítimo, y el ataque funciona incluso si la comunicación está cifrada.

Términos relacionados

Artículos relacionados