¿Qué es XSS (Cross-Site Scripting)?
Cross-Site Scripting, o XSS, es una vulnerabilidad de seguridad en los sitios web que permite a los atacantes añadir scripts dañinos a las páginas web. La mayoría de las veces, estos scripts están escritos en JavaScript.
Si alguien visita una página afectada por XSS, su navegador ejecuta el script del atacante. Esto puede resultar en el robo de cookies, secuestro de sesiones o acciones realizadas sin el permiso del usuario.
XSS, al igual que la Inyección SQL, aparece regularmente en el OWASP Top 10 como una de las vulnerabilidades más comunes en aplicaciones web.
¿Cómo funciona XSS?
XSS a menudo apunta a aplicaciones web que no verifican y limpian correctamente la entrada del usuario.
Por ejemplo, si un cuadro de comentarios permite HTML o JavaScript sin filtrar, un atacante podría añadir un código como este:
<script>alert('¡Hackeado!');</script>
Cuando las víctimas ven la página, el código malicioso se ejecuta dentro de su navegador.
Por qué XSS importa en la ciberseguridad
XSS puede llevar a una brecha mayor:
- Toma de control de cuentas (robo de cookies de sesión para hacerse pasar por usuarios)
- Robo de datos (captura de entradas de formularios como contraseñas o tarjetas de crédito)
- Ataques de phishing (inyección de formularios de inicio de sesión falsos)
- Entrega de malware (redirección de usuarios a sitios web maliciosos)
Tipos de XSS
- XSS basado en DOM
- El ataque ocurre completamente en el navegador manipulando el Modelo de Objeto de Documento (DOM) sin involucrar al servidor.
- XSS almacenado
- El script malicioso se almacena permanentemente en el servidor, como en la base de datos o la página de perfil.
- XSS reflejado
- El script se refleja en un servidor web (por ejemplo, en la URL o mensaje de error), el script se ejecutará cuando la víctima haga clic en un enlace creado por los atacantes.
Cómo prevenir XSS
- Saneamiento de entradas y codificación de salidas: siempre limpiar los datos de entrada del usuario antes de procesarlos, transformando la entrada del usuario en un formato seguro
- Usar Política de Seguridad de Contenidos (CSP): restringe qué scripts pueden ejecutarse en el navegador.
- Evitar eval() y JavaScript en línea: para reducir los riesgos de inyección.
- Pruebas de seguridad (DAST/IAST): realizar pruebas de seguridad para detectar vulnerabilidades temprano
Ejemplo en un caso del mundo real - Gusano Samy (MySpace, 2005)
Qué sucedió: Samy Kamkar publicó un perfil de MySpace que contenía una carga útil de XSS almacenado. Cuando otros usuarios veían el perfil, la carga útil se ejecutaba en sus navegadores, (a) añadía a Samy como amigo, (b) añadía la frase “Samy es mi héroe” a sus perfiles, y (c) se replicaba en las páginas de perfil de esos usuarios.
Impacto: El gusano se autopropagó a ~1 millón de usuarios en aproximadamente 20 horas, obligando a MySpace a estar fuera de línea temporalmente.
Por qué funcionó: MySpace permitía HTML/atributos sin escapar en los campos de perfil, lo que permitía la ejecución de scripts almacenados en los navegadores de los visitantes.
Lecciones / solución: Codificación de salida adecuada, sanitización de entrada, eliminación de HTML en los campos de perfil y parcheo rápido. Samy posteriormente enfrentó consecuencias legales, y MySpace implementó filtros.
Términos relacionados
- Inyección SQL
- DAST (Pruebas de Seguridad de Aplicaciones Dinámicas)
- OWASP Top 10
- CSRF (Cross-Site Request Forgery)