Cross-Site Scripting (XSS): Almacenado, Reflejado y Basado en DOM

Cross-Site Scripting (XSS): Almacenado, Reflejado y Basado en DOM

Introducción: Cuando el Atacante Controla el Navegador del Usuario

El Cross-Site Scripting (XSS) es una vulnerabilidad de inyección que permite a los atacantes insertar scripts maliciosos (código del lado del cliente, comúnmente JavaScript) en una página web. A diferencia de SQLi que ataca la base de datos, XSS ataca a los visitantes legítimos del sitio web.

El impacto de un ataque XSS es significativo: robo de cookies de sesión (lo que permite el secuestro de la cuenta del usuario), manipulación de contenido de la página o redirecciones forzadas a sitios maliciosos.

Los Tres Mecanismos de XSS

La clasificación de XSS se basa en dónde se almacena el código malicioso y cómo se entrega a la víctima:

1. XSS Almacenado (Stored XSS): El más grave.

El payload se inyecta y almacena permanentemente en el servidor (ej. en un campo de comentario, un mensaje de foro o un perfil de usuario).

Cada usuario que accede a la página que carga ese contenido almacenado se convierte en víctima. El ataque es persistente y a gran escala.

2. XSS Reflejado (Reflected XSS):

El payload se inyecta a través de la URL o un formulario y el servidor lo refleja inmediatamente en el navegador de la víctima como parte de la respuesta HTTP (ej. un mensaje de error que muestra el input del usuario).

El atacante debe engañar a la víctima para que haga clic en un enlace malicioso que contiene el payload. El ataque es no persistente y dirigido a usuarios individuales.

3. XSS Basado en DOM (DOM-Based XSS):

El ataque ocurre completamente en el lado del cliente y nunca toca el servidor. El código JavaScript manipula el Modelo de Objeto del Documento (DOM) basándose en datos que no son de confianza (ej. parámetros de la URL), resultando en la ejecución del script malicioso.

Es más difícil de detectar con herramientas de seguridad tradicionales (WAFs) ya que el ataque ocurre después de que la página se ha descargado.

Mitigación: Estrategias de Defensa por Capas

La prevención de XSS es responsabilidad directa del desarrollador:

1. Codificación de Salida (Output Encoding):

La defensa fundamental. Antes de renderizar cualquier dato proporcionado por el usuario en el HTML, debe ser codificado. Esto transforma los caracteres peligrosos (ej. el < de ) a su representación de entidad HTML (<), de modo que el navegador lo muestre como texto simple y no lo ejecute como código.

2. Sanitización:

Si la aplicación requiere que el usuario introduzca HTML (ej. un editor de texto enriquecido), se deben usar bibliotecas de sanitización robustas que permitan solo un subconjunto seguro de etiquetas (ej. o ) y eliminen atributos peligrosos (como onload o onerror).

3. Content Security Policy (CSP):

Una capa de seguridad moderna que permite a los desarrolladores especificar qué fuentes de contenido (scripts, estilos) son de confianza, bloqueando la carga de scripts maliciosos inyectados externamente.