Articles

XSS vs CSRF

En esta sección, explicaremos las diferencias entre XSS y CSRF, y discutiremos si los tokens CSRF pueden ayudar a prevenir ataques XSS.

¿Cuál es la diferencia entre XSS y CSRF?

El cross-site scripting (o XSS) permite a un atacante ejecutar JavaScript arbitrario dentro del navegador de un usuario víctima.

La falsificación de petición en sitios cruzados (o CSRF) permite a un atacante inducir a un usuario víctima a realizar acciones que no tiene intención de realizar.

Las consecuencias de las vulnerabilidades XSS suelen ser más graves que las de CSRF:

  • CSRF a menudo sólo se aplica a un subconjunto de acciones que un usuario es capaz de realizar. Muchas aplicaciones implementan defensas CSRF en general, pero pasan por alto una o dos acciones que quedan expuestas. Por el contrario, un exploit XSS exitoso normalmente puede inducir a un usuario a realizar cualquier acción que el usuario sea capaz de realizar, independientemente de la funcionalidad en la que surge la vulnerabilidad.
  • CSRF puede describirse como una vulnerabilidad «unidireccional», en el sentido de que mientras un atacante puede inducir a la víctima a emitir una solicitud HTTP, no puede recuperar la respuesta de esa solicitud. Por el contrario, el XSS es «bidireccional», en el sentido de que el script inyectado por el atacante puede emitir peticiones arbitrarias, leer las respuestas y exfiltrar datos a un dominio externo de su elección.

¿Pueden los tokens CSRF prevenir los ataques XSS?

Algunos ataques XSS pueden prevenirse mediante el uso efectivo de tokens CSRF. Considere una simple vulnerabilidad XSS reflejada que puede ser trivialmente explotada así:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

Ahora, supongamos que la función vulnerable incluye un token CSRF:

https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>

Suponiendo que el servidor valida correctamente el token CSRF, y rechaza las peticiones sin un token válido, entonces el token impide la explotación de la vulnerabilidad XSS. La pista aquí está en el nombre: «cross-site scripting», al menos en su forma reflejada, implica una petición cruzada. Al impedir que un atacante falsifique una solicitud de sitio cruzado, la aplicación evita la explotación trivial de la vulnerabilidad XSS.

Aquí surgen algunas advertencias importantes:

  • Si una vulnerabilidad XSS reflejada existe en cualquier otra parte del sitio dentro de una función que no está protegida por un token CSRF, entonces ese XSS puede ser explotado de la manera normal.
  • Si una vulnerabilidad XSS explotable existe en cualquier parte de un sitio, entonces la vulnerabilidad puede ser aprovechada para hacer que un usuario víctima realice acciones incluso si esas acciones están protegidas por tokens CSRF. En esta situación, el script del atacante puede solicitar la página relevante para obtener un token CSRF válido, y luego usar el token para realizar la acción protegida.
  • Los tokens CSRF no protegen contra las vulnerabilidades XSS almacenadas. Si una página que está protegida por un token CSRF es también el punto de salida de una vulnerabilidad XSS almacenada, entonces esa vulnerabilidad XSS puede ser explotada de la manera habitual, y la carga útil XSS se ejecutará cuando un usuario visite la página.