XSS (Cross-Site Scripting)
Se lee en aproximadamente 4 minutos
Última actualización: 2026-03-10
Qué es XSS (Cross-Site Scripting)
XSS (Cross-Site Scripting) es una técnica de ataque que explota vulnerabilidades en aplicaciones web para ejecutar JavaScript malicioso en el navegador del usuario. El script inyectado por el atacante se ejecuta en el contexto del sitio legítimo en el navegador de la víctima, lo que puede causar daños extensos como robo de cookies, secuestro de sesión, redirección a páginas de phishing y registro de pulsaciones de teclas.
Es una vulnerabilidad web representativa que ha estado clasificada en el OWASP Top 10 durante años, y es uno de los primeros riesgos de seguridad que los desarrolladores de aplicaciones web deben comprender.
Los 3 tipos de XSS
El XSS se clasifica en 3 tipos según el mecanismo de ataque.
XSS reflejado (Reflected XSS)
Ocurre cuando los datos enviados por el usuario (parámetros de URL, entrada de formularios, etc.) se reflejan directamente en la respuesta del servidor. El atacante crea una URL que contiene un script malicioso y hace que la víctima haga clic en ella. Los casos típicos son páginas de resultados de búsqueda o mensajes de error que muestran valores de entrada sin escapar.
XSS almacenado (Stored XSS)
El script malicioso se almacena en la base de datos del servidor y se ejecuta cada vez que otros usuarios visualizan esos datos. Los objetivos de ataque incluyen publicaciones en foros, perfiles de usuario y secciones de comentarios. A diferencia del reflejado, no es necesario que la víctima haga clic en una URL específica, por lo que el alcance del impacto es mayor.
XSS basado en DOM
Ocurre cuando el JavaScript del lado del cliente manipula el DOM (Document Object Model) de forma insegura. Se produce cuando la entrada del usuario se inserta en el DOM de manera insegura a través de document.location, document.URL, innerHTML, etc. Como el código malicioso no está contenido en la respuesta del servidor, no se puede detectar en los registros del servidor.
Escenarios de ataque concretos
Comprendamos cómo se ejecutan los ataques XSS con escenarios concretos.
Secuestro de sesión mediante robo de cookies
Un atacante publica un script en un foro. Cuando otros usuarios ven esa publicación, la cookie de sesión almacenada en el navegador se envía al servidor del atacante. El atacante utiliza esa cookie para secuestrar la sesión de la víctima y operar el sitio como si hubiera iniciado sesión como la víctima.
Este ataque se puede prevenir si se establece el atributo HttpOnly en la cookie, ya que bloquea el acceso desde JavaScript. Sin embargo, todavía existen muchos sitios donde HttpOnly no está configurado.
Inyección de formulario de phishing
Se utiliza XSS para mostrar un formulario de inicio de sesión falso en el sitio legítimo y robar las credenciales del usuario. Como la URL sigue siendo la del dominio legítimo, es extremadamente difícil para el usuario detectar el formulario falso.
Medidas de defensa y mejores prácticas de implementación
Las medidas contra XSS se basan en la defensa multicapa que combina validación de entrada, escape de salida y funciones de protección del navegador.
- Escape de salida riguroso: Realizar el escape apropiado según el contexto de salida: HTML, JavaScript, URL, CSS. En contexto HTML, convertir
<,>,&,",'a entidades. - Implementación de CSP (Content Security Policy): Prohibir la ejecución de scripts inline y permitir solo la ejecución de scripts de dominios autorizados. Incluso si ocurre XSS, puede bloquear la ejecución del script del atacante.
- Atributo
HttpOnlyen cookies: EstablecerHttpOnlyen las cookies de sesión para bloquear el acceso desde JavaScript. - Validación de entrada: Verificar que la entrada del usuario coincida con el formato esperado (numérico, dirección de correo, etc.). Sin embargo, la validación de entrada por sí sola no puede prevenir completamente el XSS, por lo que debe combinarse con el escape de salida.
- Escape automático de motores de plantillas: Frameworks como React, Vue y Angular escapan la salida por defecto. Minimizar el uso de
dangerouslySetInnerHTML(React) ov-html(Vue). - Configuración de encabezados de seguridad: Prevenir el MIME type sniffing con
X-Content-Type-Options: nosniff.
La detección de patrones XSS mediante WAF también es efectiva, pero como existen técnicas para evadir el WAF, no sustituye las medidas del lado de la aplicación.
Conceptos erróneos comunes
- XSS es una vulnerabilidad menor que solo altera la apariencia
- XSS puede causar daños graves como secuestro de sesión, robo de credenciales, distribución de malware y toma de control de privilegios de administrador. Especialmente el XSS almacenado afecta a todos los usuarios que visitan el sitio, por lo que el alcance del impacto es extremadamente amplio.
- Validar la entrada previene el XSS
- La validación de entrada es solo una capa de defensa. Los atacantes evaden la validación mediante diversas técnicas como conversión de codificación, normalización Unicode y cambio de contexto. La medida fundamental es el escape según el contexto de salida, y se recomienda combinarlo con CSP.
Comparación entre XSS y CSRF
XSS
Ejecuta el script del atacante en el navegador de la víctima. Explota la confianza del sitio en el usuario. Las medidas son escape de salida y CSP. Los principales daños son robo de cookies y secuestro de sesión.
CSRF
Falsifica solicitudes legítimas desde el navegador de la víctima. Explota la confianza del usuario en el sitio. Las medidas son verificación de tokens y cookies SameSite. El principal daño es la ejecución de operaciones no intencionadas.