CSRF (Cross-Site Request Forgery): Previniendo la Falsificación de Solicitudes

Publicado el por Admin

Cross-Site Request Forgery (CSRF)

El ataque **Cross-Site Request Forgery (CSRF)**, también conocido como "ataque de un solo clic" o "secuestro de sesión", es una vulnerabilidad de seguridad web que engaña a los usuarios autenticados para que realicen acciones no deseadas en una aplicación web en la que tienen una sesión activa. A diferencia de XSS, donde el atacante inyecta código malicioso, en CSRF el atacante fuerza al navegador de la víctima a enviar una solicitud maliciosa a un sitio web de confianza, aprovechando que la víctima ya está autenticada.


¿Cómo Funciona un Ataque CSRF?

El principio detrás de CSRF es el siguiente: los navegadores web envían automáticamente las cookies de sesión (incluidas las de autenticación) con cada solicitud a un dominio específico. Un atacante puede crear una solicitud web maliciosa (por ejemplo, una imagen invisible, un enlace o un formulario oculto) en un sitio web bajo su control. Si un usuario, que ya ha iniciado sesión en el sitio legítimo (banco, red social, etc.), visita el sitio web del atacante, el navegador del usuario enviará automáticamente la solicitud maliciosa junto con las cookies de sesión válidas a la aplicación de confianza.

El sitio web de confianza, al recibir una solicitud que parece legítima (porque incluye las cookies de sesión del usuario autenticado), ejecuta la acción, pensando que el usuario la inició voluntariamente.


Ejemplos Comunes de Ataques CSRF

Un ataque CSRF puede ser utilizado para forzar a un usuario a realizar una variedad de acciones indeseadas, tales como:

Escenario de ataque:

  1. La víctima inicia sesión en su banco (`banco.com`).
  2. El atacante envía un correo electrónico o un mensaje en una red social a la víctima, con un enlace a una página maliciosa (`sitio-atacante.com`).
  3. La víctima hace clic en el enlace y visita `sitio-atacante.com`.
  4. En `sitio-atacante.com`, hay un formulario o una etiqueta `` oculta que apunta a una URL del banco, por ejemplo:
    <img src="http://banco.com/transferencia?monto=1000&a_cuenta=atacante" style="display:none;">
  5. El navegador de la víctima, al intentar cargar la "imagen" del banco, envía la solicitud junto con las cookies de sesión válidas de `banco.com`.
  6. El banco procesa la transferencia como si la víctima la hubiera iniciado.

Impacto de CSRF

El impacto de un ataque CSRF depende de la función que el atacante logre falsificar. Puede llevar a la pérdida de dinero, el compromiso de la cuenta de un usuario, la manipulación de datos, o incluso el control administrativo de una aplicación si el usuario comprometido tiene privilegios elevados.


Prevención de CSRF

La prevención de CSRF es crucial y se centra en asegurar que el servidor pueda verificar que una solicitud fue iniciada intencionalmente por el usuario y no por un atacante. Las defensas más efectivas incluyen:

  1. **Tokens Anti-CSRF (Tokens Sincronizadores):**

    Es el método más común y efectivo. El servidor genera un token único e impredecible para cada sesión de usuario y lo incluye en cada formulario o solicitud sensible (POST, PUT, DELETE). El servidor verifica que el token recibido coincide con el token esperado. Si no coincide, la solicitud es rechazada.

    <form action="/transferir" method="POST">
        <input type="hidden" name="csrf_token" value="GENERATED_TOKEN_UNICO">
        <input type="text" name="monto">
        <button type="submit">Transferir</button>
    </form>

    El atacante no puede predecir ni obtener este token, por lo que su solicitud falsificada no lo incluirá, o incluirá uno incorrecto.

  2. **Atributo `SameSite` para Cookies:**

    Las cookies con el atributo `SameSite` (Lax, Strict, None) ayudan a mitigar CSRF al controlar cuándo se envían las cookies en solicitudes de origen cruzado. `Strict` es la más segura, pero puede romper la funcionalidad de algunos sitios si no se maneja bien; `Lax` es un buen equilibrio.

  3. **Verificación del Encabezado `Referer`:**

    El servidor puede verificar el encabezado `Referer` para asegurar que la solicitud proviene de un dominio de confianza. Sin embargo, no es 100% fiable ya que puede ser manipulado o no estar presente.

  4. **Re-autenticación para Acciones Sensibles:**

    Para acciones de alto riesgo (ej. cambio de contraseña, transferencias bancarias), solicitar al usuario que vuelva a introducir su contraseña antes de completar la operación.

  5. **Custom Headers (Encabezados Personalizados):**

    Aunque menos común para CSRF, algunas aplicaciones usan encabezados HTTP personalizados que requieren JavaScript para ser añadidos. Dado que los ataques CSRF tradicionales no pueden ejecutar JavaScript en el dominio de la víctima, no pueden añadir estos encabezados.


Consideraciones Éticas

Este artículo se proporciona con fines educativos y de concienciación sobre la seguridad informática. Intentar llevar a cabo ataques CSRF en sistemas sin el permiso explícito del propietario es ilegal y puede acarrear graves consecuencias legales. Utiliza esta información de manera responsable y ética, y siempre en entornos autorizados y controlados (como laboratorios de pruebas).

¿Has tenido experiencia implementando defensas contra CSRF? ¿Qué desafíos has encontrado? ¡Comparte tus ideas y preguntas!

La complejidad de los ataques CSRF y sus defensas puede variar según la aplicación y el entorno. Siempre consulta las últimas directrices de seguridad de OWASP y las mejores prácticas específicas para tu tecnología.