XSS (Cross-Site Scripting)
Se lee en aproximadamente 4 minutos
Última actualización: 2026-09-01
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.
En el OWASP Top 10, desde la edición de 2021 el XSS ya no es un elemento independiente, sino que se recoge como CWE-79 (Cross-Site Scripting) dentro de la categoría Injection: A03:2021 en la edición de 2021 y A05:2025 en la de 2025. Según el recuento de la edición de 2025 de OWASP, se han notificado más de 30 mil CVE para Cross-Site Scripting, 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. Cuando el código de ataque se sitúa en el identificador de fragmento (la parte de la URL posterior a #), el navegador no envía esa parte al servidor, por lo que no queda rastro en los registros de acceso 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.
Si la cookie de sesión tiene el atributo HttpOnly, se bloquea su lectura a través de document.cookie. Sin embargo, lo único que se bloquea es la lectura de la cookie: no impide los ataques en los que el script inyectado envía peticiones desde el navegador de la víctima y realiza operaciones en su nombre.
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. La URL sigue siendo la del dominio legítimo y la comunicación aparenta estar protegida por el certificado del sitio legítimo, por lo que la simple inspección visual de la barra de direcciones no permite distinguir el formulario falso.
Medidas de defensa y mejores prácticas de implementación
Las medidas contra XSS se basan en una defensa multicapa que toma el escape de la salida como eje y lo combina con la validación de entrada y las 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. Funciona como una capa que limita el daño cuando se produce un XSS, pero según su configuración pueden quedar vías de evasión, por lo que no sustituye al escape de la salida.
- 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.
Para obtener más información sobre este tema, consulte Encabezados de seguridad HTTP - 5 encabezados esenciales para proteger tu sitio web.
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.