Cómo Subsanar Vulnerabilidades CSRF: Mejores Prácticas y Estrategias

El CSRF (Cross-Site Request Forgery), o falsificación de petición en sitios cruzados, es una de las amenazas más subestimadas en el mundo de la ciberseguridad. Aunque a menudo pasa desapercibido, un ataque CSRF puede tener consecuencias devastadoras para usuarios y organizaciones. Este tipo de ataque explota la confianza que un sitio web tiene en el navegador del usuario, permitiendo que un atacante realice acciones maliciosas en nombre del usuario sin su conocimiento o consentimiento.

En este artículo, exploraremos en detalle cómo funciona un ataque CSRF, las consecuencias que puede acarrear y cómo las organizaciones pueden protegerse eficazmente de esta amenaza, aplicando las mejores prácticas y comprendiendo los fallos comunes en su mitigación.

Esquema de un ataque CSRF mostrando la interacción entre atacante, víctima y sitio web vulnerable

¿Qué es un Ataque CSRF?

Un ataque CSRF ocurre cuando un atacante engaña a un usuario legítimo para que realice acciones no deseadas en una aplicación web en la que ya está autenticado. A diferencia de otros tipos de ataques, como el phishing o el malware, el atacante no necesita robar las credenciales del usuario para ejecutar sus acciones. En cambio, aprovecha la sesión activa del usuario en un sitio web para enviar solicitudes maliciosas al servidor.

Imaginemos un escenario típico: un usuario inicia sesión en su cuenta bancaria en línea. Mientras tanto, visita un sitio web malicioso sin saberlo. Ese sitio puede contener un código oculto que envía una solicitud a la cuenta bancaria del usuario para transferir dinero a la cuenta del atacante. Debido a que el usuario ya ha iniciado sesión en el sitio bancario, el servidor considera la solicitud como legítima y la ejecuta sin dudar. Todo esto ocurre sin que el usuario se dé cuenta.

Lo que hace que los ataques CSRF sean particularmente insidiosos es que aprovechan la confianza entre el servidor y el navegador del usuario. El servidor no puede distinguir entre una solicitud legítima y una maliciosa si ambas provienen del mismo navegador y sesión autenticada. La falsificación de peticiones entre sitios (CSRF) se refiere a un ataque que hace que el usuario final realice acciones no deseadas dentro de una aplicación web que ya le ha otorgado autenticación.

¿Cómo Funciona un Ataque CSRF?

Para comprender mejor los ataques CSRF, es importante entender cómo las aplicaciones web manejan la autenticación y la autorización. Cuando un usuario inicia sesión en una aplicación, el servidor crea una sesión autenticada que se almacena en una cookie en el navegador del usuario. Esta cookie es enviada automáticamente al servidor cada vez que el usuario realiza una solicitud.

Un ataque CSRF se basa en esta premisa. El atacante crea un código que genera una solicitud HTTP legítima (como una transferencia de dinero o un cambio de contraseña) y engaña al usuario para que lo ejecute. Esto puede ocurrir a través de múltiples vectores, como un enlace malicioso en un correo electrónico, un botón en un sitio web comprometido o incluso a través de un script inyectado en un sitio legítimo. Dado que el navegador del usuario ya ha almacenado la cookie de autenticación, la solicitud maliciosa incluye automáticamente esta información cuando se envía al servidor. El servidor, que confía en la cookie de autenticación, procesa la solicitud como si hubiera sido generada por el usuario. En este punto, el atacante ha logrado su objetivo sin necesidad de tener acceso directo a las credenciales del usuario.

Una de las razones por las que los ataques CSRF son efectivos es porque las solicitudes enviadas como parte de un ataque parecen legítimas desde la perspectiva del servidor, haciendo que la detección sea más complicada. Los ataques CSRF se enfocan en funciones que cambian el servidor de una aplicación web objetivo. La forma en que un atacante aprovecha los cambios que promulga el ataque varía según sus objetivos, desde robar dinero hasta alterar información en el servidor en una fecha posterior.

Vectores de Ataque Comunes

Un ataque de CSRF depende del uso de la ingeniería social. Un atacante engaña a su víctima enviando un enlace a través de un chat o correo electrónico. Por ejemplo, el atacante, Joe, puede engañar a Mary para que cargue una URL mientras está iniciando sesión en la aplicación web del banco. La URL de exploit puede disfrazarse como un enlace inocente que pide algo más, como “¡Vea mi video!”. Este texto podría colocarse dentro de un enlace de aspecto inocente o una imagen falsa. Siempre que Mary haga clic en el enlace mientras inicia sesión en la aplicación de banca en línea, el ataque tendrá éxito.

En ocasiones, el script de ataque CSRF se puede almacenar en el sitio objetivo. En la codificación del lenguaje de marcado de hipertexto (HTML), se utiliza un archivo IMG para almacenar imágenes y una etiqueta iframe para colocar un documento dentro de la página. Si un atacante puede obtener acceso al código HTML del sitio, puede insertar el código de ataque CSRF dentro de un archivo IMG o etiqueta iframe. Estos tipos de vulnerabilidades se conocen como fallas de CSRF almacenadas. Los problemas que causa un ataque de CSRF para el objetivo son peores si el CSRF se puede almacenar en el sitio real, ya que la página a la que se dirige parece menos sospechosa.

Diagrama de flujo de cómo un atacante utiliza ingeniería social para ejecutar un ataque CSRF

Consecuencias de un Ataque CSRF

El impacto de un ataque CSRF puede variar según la naturaleza de la aplicación y las acciones que el atacante logre ejecutar. Sin embargo, las consecuencias pueden ser graves tanto para los usuarios individuales como para las organizaciones.

  • Acceso no Autorizado y Fraude Financiero: Una de las principales consecuencias es el acceso no autorizado a información sensible o recursos críticos. En aplicaciones bancarias o de comercio electrónico, un ataque CSRF puede permitir que el atacante realice transacciones financieras fraudulentas, cambie los detalles de la cuenta del usuario o incluso robe su identidad en línea. Estas acciones pueden tener un impacto devastador en la confianza del usuario en la plataforma afectada.
  • Compromiso de Datos y Operaciones Empresariales: En el caso de las plataformas empresariales o aplicaciones SaaS (software como servicio), un ataque CSRF podría permitir que un atacante cambie configuraciones críticas, elimine datos importantes o gane acceso a recursos internos de la organización. Dependiendo del nivel de acceso del usuario afectado, el daño puede ser considerable.
  • Riesgos Legales y Regulatorios: Además del impacto directo, los ataques CSRF también pueden tener consecuencias legales y regulatorias para las organizaciones. Dependiendo de la jurisdicción y la naturaleza de los datos comprometidos, las empresas pueden enfrentar multas y sanciones por no proteger adecuadamente la información de sus usuarios.
  • Pérdida de Confianza y Daño a la Reputación: Cuando los usuarios descubren que una plataforma ha sido vulnerable a un ataque CSRF, pueden perder la confianza en la capacidad de la organización para proteger su información. Esto puede llevar a una reducción en la base de usuarios, así como a un impacto negativo en la reputación de la empresa.

¿Qué es un ataque CSRF? 💀 Ejemplo de vulnerabilidad

Mejores Prácticas para Protegerse de Ataques CSRF

A pesar de lo sofisticado que puede parecer un ataque CSRF, existen estrategias efectivas para mitigar el riesgo y proteger tanto a los usuarios como a las organizaciones. Un enfoque integral para protegerse de los ataques CSRF implica combinar múltiples estrategias para asegurar que las solicitudes maliciosas sean identificadas y bloqueadas antes de que causen daños.

1. Implementación de Tokens Anti-CSRF

Una de las defensas más comunes y efectivas contra los ataques CSRF es el uso de tokens anti-CSRF. Un token CSRF se refiere a un valor único, secreto e impredecible que genera la aplicación en el lado del servidor y se transmite al cliente de tal manera que se incluye en la siguiente solicitud realizada por el cliente.

Estos tokens son valores únicos generados por el servidor y enviados al cliente en cada solicitud legítima. El proceso de validación implica algunos pasos: después de crear el token, se envía al cliente para que pueda incluirse en una solicitud HTTP que el cliente realiza más adelante. Se envía el token anti-CSRF con los datos del formulario y se verifica su valor en el servidor. Si no se incluye el token o este no coincide con el token esperado, entonces el servidor no ejecuta la consulta.

Los tokens antifalsificación funcionan porque la página malintencionada no puede leer los tokens del usuario, debido a directivas de mismo origen (que impiden que los documentos hospedados en dos sitios diferentes accedan al contenido del otro). Dado que el atacante no puede obtener el token, sus solicitudes maliciosas serán rechazadas por el servidor. La clave aquí es que el token es verificado en cada acción crítica, lo que asegura que las solicitudes provengan de una fuente confiable.

Se debería requerir tokens antifalsificación para cualquier método que no sea seguro (POST, PUT, DELETE). Además, asegúrese de que los métodos seguros (GET, HEAD) no tienen ningún efecto secundario. El token anti-CSRF se utiliza en la defensa CSRF del lado del servidor. Si los valores de la variable de sesión coinciden con el campo de formulario oculto, la aplicación aceptará la solicitud. Si los dos valores no coinciden, la solicitud se elimina. El atacante no conoce el valor dentro del campo de formulario oculto, por lo que no puede usarlo para que se acepte la solicitud.

Consideraciones para Solicitudes AJAX

El token de formulario puede ser un problema para las solicitudes AJAX, ya que una solicitud de AJAX podría enviar datos JSON, no datos de formulario HTML. Una solución consiste en enviar los tokens en un encabezado HTTP personalizado. El código siguiente usa la sintaxis de Razor para generar los tokens y, a continuación, agrega los tokens a una solicitud de AJAX. Al procesar la solicitud, extraiga los tokens del encabezado de solicitud. A continuación, llame al método AntiForgery.Validate para validar los tokens.

2. Validación del Encabezado Referer

Otra técnica es validar el encabezado Referer de las solicitudes entrantes. Esto permite al servidor verificar si la solicitud proviene de un sitio autorizado. Sin embargo, este enfoque tiene algunas limitaciones, ya que algunos navegadores o redes corporativas pueden eliminar o modificar este encabezado, lo que reduce su efectividad.

3. Uso de Cookies con la Opción SameSite

Las cookies con la opción SameSite pueden ayudar a prevenir el envío de cookies de autenticación en solicitudes de terceros. Al configurar las cookies como SameSite=Lax o Strict, el navegador del usuario solo enviará las cookies en solicitudes que provienen del mismo sitio web, lo que bloquea los intentos de CSRF desde sitios externos. Si la cookie de sesión se designa como una cookie de SameSite, solo se puede enviar con solicitudes que provienen del mismo dominio. El dominio del atacante, en la mayoría de los casos, será diferente del del sitio web objetivo. Sin embargo, si un pirata informático obtiene acceso al dominio objetivo y trabaja desde dentro de él, es posible que la solicitud provenga del mismo sitio y apruebe la "prueba" del mismo sitio. Por lo tanto, es crucial tener una protección adecuada para cualquier aplicación web y los servidores que las alojan.

4. Implementación de Autenticación de Dos Factores (2FA)

Aunque no previene directamente los ataques CSRF, implementar autenticación de dos factores (2FA) añade una capa adicional de seguridad. Incluso si el atacante logra engañar al usuario para realizar una solicitud maliciosa, es posible que se necesite una segunda forma de autenticación (como un código SMS) para completar la acción, dificultando el éxito del ataque.

5. Límites y Validaciones en Acciones Críticas

Las aplicaciones deben imponer restricciones y validaciones adicionales en acciones críticas como cambios de contraseña o transferencias de dinero. Esto puede incluir la solicitud de una reconfirmación de la identidad del usuario antes de permitir la ejecución de acciones sensibles. Por ejemplo, al incluir un parámetro adicional con un valor que el atacante no conoce, se pueden evitar ataques CSRF.

Ejemplo de Código: Añadir Parámetros Impredecibles

Considere el siguiente sistema vulnerable para cambiar una contraseña, donde no existen parámetros impredecibles:

<?phpif (isset($_GET['Change'])) { // Turn requests into variables $pass_new = $_GET['password_new']; $pass_conf = $_GET['password_conf']; if (($pass_new == $pass_conf)){ $pass_new = mysql_real_escape_string($pass_new); $pass_new = md5($pass_new); $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); echo "<pre> Password Changed </pre>"; mysql_close(); } else { echo "<pre> Passwords did not match.</pre>"; }}?>

En este caso, no existen parámetros impredecibles. En cambio, si agregas parámetros impredecibles, puedes evitar esta vulnerabilidad. Aquí un ejemplo de cómo se podría mejorar con la validación de la contraseña actual:

<?phpif (isset($_GET['Change'])) { // Turn requests into variables $pass_curr = $_GET['password_current']; // Parámetro impredecible $pass_new = $_GET['password_new']; $pass_conf = $_GET['password_conf']; // Sanitise current password input $pass_curr = stripslashes( $pass_curr ); $pass_curr = mysql_real_escape_string( $pass_curr ); $pass_curr = md5( $pass_curr ); // Check that the current password is correct $qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';"; $result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' ); if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){ $pass_new = mysql_real_escape_string($pass_new); $pass_new = md5($pass_new); $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); echo "<pre> Password Changed </pre>"; mysql_close(); } else { echo "<pre> Passwords did not match or current password incorrect.</pre>"; }}?>

Errores Comunes en la Implementación de Tokens Anti-CSRF

Algunas de las vulnerabilidades de CSRF más comunes provienen de errores cometidos en el proceso de validación de tokens de CSRF. Es fundamental entender cómo estos errores pueden comprometer la seguridad:

  • Validación Incorrecta con Métodos GET vs. POST: En algunas aplicaciones, la validación del token no se realiza correctamente si se utiliza el método GET en lugar del método POST. Todo lo que el atacante tiene que hacer es cambiar de usar el método POST a usar el método GET para eludir la verificación.
  • Omisión de Validación si el Token está Ausente: En ciertas aplicaciones, el proceso de validación se omite cuando el token no está presente. Si el atacante intenta explotar este tipo de aplicación web, solo tiene que eliminar el código que tiene la información del token para que su solicitud sea aceptada.
  • Tokens No Vinculados a la Sesión del Usuario: Hay aplicaciones que mantienen un conjunto de tokens válidos, y siempre que el token presentado esté en ese conjunto, se aceptará. Sin embargo, esto significa que el token no tiene que estar vinculado a la sesión específica del usuario, permitiendo a un atacante usar un token válido de otra sesión.
  • Vulnerabilidad por Uso de Múltiples Marcos (Frameworks): Con algunas aplicaciones, si se utilizan dos marcos, se pueden aceptar las cookies de ambos marcos. Si este es el caso, el atacante puede colocar una cookie en el navegador de la víctima objetivo, luego iniciar sesión con su propia cuenta para obtener un token válido y su cookie asociada, y finalmente colocar su cookie en el navegador de la víctima. Debido a que la validación acepta cookies de ambos marcos, la cookie del atacante funciona tan bien para la validación como la de la víctima.
  • Duplicación de Tokens en Cookie y Parámetro: En algunas aplicaciones, no se conserva ningún registro de tokens ya utilizados. En su lugar, duplican cada token en una cookie y el parámetro de solicitud asociado. Este método funciona si el sitio web objetivo tiene la capacidad de establecer cookies. Siempre que un atacante conozca las combinaciones de valor y los parámetros del formulario que completará una víctima, puede lanzar un ataque de CSRF.

Desajuste del Token CSRF (CSRF Token Mismatch)

Una falta de coincidencia de token CSRF se produce cuando el token antifalsificación enviado con una solicitud HTTP no coincide con el token que el servidor espera para la sesión del usuario. En la práctica, esta falta de coincidencia puede indicar que la solicitud no procede legítimamente del usuario (frustrando así un posible intento de falsificación).

Para el ingeniero de seguridad moderno, comprender el desajuste del token CSRF no se trata solo de evitar fallos triviales en el envío de formularios. Es un indicador estratégico que revela una mala configuración de la sesión, fallos en el proxy o en la caché, errores en la gestión de tokens en el front-end o incluso indicios de ataques en directo. Los patrones de token JWT/CSRF sin estado incorporan firmas HMAC en lugar de almacenar sesiones.

Causas Raíz y Soluciones

A continuación, se presenta una tabla que resume las causas comunes de desajustes de tokens CSRF, sus señales de diagnóstico y las soluciones rápidas recomendadas:

Causa Raíz Señal de Diagnóstico Solución Rápida
Expiración de la sesión / token regenerado El usuario ve el desajuste después de inactividad Aumentar el TTL de sesión o actualizar el token al iniciar sesión
El formulario/HTML en caché incluye un token obsoleto El valor del token no coincide con la sesión activa Desactivar el almacenamiento en caché de los formularios; añadir cabeceras Cache-Control
Falta el encabezado token AJAX/SPA Las solicitudes Fetch/Axios tienen éxito sin cabecera; solo hay discordancia si se omite la cabecera. Asegúrese de que cada solicitud incluya un encabezado token (por ejemplo, X-CSRF-TOKEN)
Cookie de dominio/subdominio mal configurada No se ha enviado la cookie de token o la sesión no coincide en el subdominio. Alinear el dominio de la cookie, asegurar el mismo origen o subdominio SameSite
SameSite / Secure / HttpOnly mal configurado Cookie CSRF no enviada en contexto cross-site, causando desajuste Utilice SameSite=Lax o Strict, asegure si HTTPS; documentar los flujos entre sitios
Proxy inverso, equilibrador de carga, interferencia CDN Desajuste de token solo detrás de la capa proxy Asegúrese de que los proxies reenvían las cabeceras y desactive la caché que elimina los tokens.
Regeneración de tokens en un momento inesperado Múltiples tokens generados en la misma sesión, el navegador utiliza el antiguo No regenere el token CSRF por formulario; solo una vez por sesión a menos que sea necesario.
Extensión del navegador / bloqueo de cookies/scripts Token cookie no creado/leído Pedir al usuario que incluya un sitio en la lista blanca o que desactive las extensiones que interfieren (por ejemplo, los bloqueadores de anuncios).

Detección y Automatización de Desajustes de Token CSRF

Para un pentester o ingeniero de seguridad, el desajuste del token CSRF no es solo un mecanismo defensivo: es una señal de inteligencia. Es crucial explorar puntos finales que realizan operaciones de cambio de estado (POST, PUT, DELETE) y realizar fuzzing automatizado, enviando peticiones sin token, con un token inválido o con un token de sesión anterior.

Los equipos de seguridad modernos integran la automatización y la inteligencia artificial para detectar regresiones, vulnerabilidades y desviaciones. Herramientas como Penligent.ai automatizan la detección de fallos relacionados con CSRF, incluyendo los desajustes de token. Rastrea los flujos de autenticación, sigue los ciclos de vida de los tokens, inyecta variantes de tokens malformados o ausentes y correlaciona los resultados para generar conclusiones procesables. Al combinar la detección de anomalías mediante aprendizaje automático con la validación basada en reglas, Penligent detecta los puntos finales en los que se producen desajustes en los tokens en producción o en entornos solo CI.

La integración de estas herramientas en el proceso CI/CD permite que cada compilación active un análisis de todos los puntos finales que cambian de estado. Cuando se produce un desajuste, Penligent produce un hallazgo, por ejemplo: endpoint /api/v1/configuración, código de respuesta 419, falta la cabecera token, la misma petición con token devuelve 200. Adjunta volcado de solicitud/respuesta, curl-replay, y una sugerencia de remedio (por ejemplo, "Asegúrese de que el conjunto de cabecera X-CSRF-TOKEN y el dominio de la cookie coinciden"). Con el tiempo, se obtienen métricas de referencia (frecuencia de desajustes, nuevos puntos finales expuestos) y se puede supervisar la deriva mediante métricas en el panel de control.

Manejo en Frameworks Populares

  • Laravel: Adjunta un TokenMismatchException cuando el token no se verifica.
  • Django: Utiliza CsrfViewMiddleware y la etiqueta de plantilla {% csrf_token %}.
  • Node.js (csurf): Se utiliza csurf middleware con analizador de cookies. Para solucionar problemas, a menudo es necesario hacer primero una petición GET al endpoint CSRF por defecto de Sanctum (en el caso de Laravel Sanctum) y luego añadir manualmente la cabecera X-XSRF-TOKEN con el valor de la cookie.

Recomendaciones Adicionales para la Seguridad General

Además de las medidas específicas contra CSRF, la seguridad integral de las aplicaciones web también implica:

  • Aplicación de Parches y Actualizaciones: Asegúrese de que todo el software, firmware y sistemas estén actualizados con los últimos parches de seguridad.
  • Gestión de Configuración Segura: Se deben aplicar configuraciones seguras en todos los sistemas para minimizar superficies de ataque.
  • Registro y Monitoreo Exhaustivo: Configure un registro y monitoreo exhaustivo para detectar y responder rápidamente a posibles ataques y anomalías.
  • Segmentación de Redes: Use segmentación de redes para limitar el impacto potencial de un ataque, conteniendo la brecha si ocurriera.

tags: #como #subsanar #una #vulnerabilidad #csrf