Cross-Site Scripting (XSS)
XSS es una vulnerabilidad que permite a atacantes inyectar código JavaScript malicioso en páginas web que otros usuarios visitan. Esto puede usarse para robar cookies, sesiones, hacer phishing o manipular el comportamiento del navegador sin permiso.
Tipos de XSS
- Reflejado: El script malicioso se inserta en una petición (como en una URL o formulario) y el servidor lo refleja directamente en la respuesta sin filtrar.
- Persistente (o almacenado): El código se guarda en bases de datos, comentarios o cualquier almacenamiento, y se ejecuta cada vez que alguien carga esa página afectada.
- DOM-based: El ataque sucede en el navegador, cuando el JavaScript manipula el DOM con datos inseguros, sin que el servidor intervenga directamente.
Ejemplo simple de XSS reflejado
Si una URL recibe un parámetro así:
https://web.com/buscar?q=<script>alert('XSS')</script>
y el servidor devuelve sin filtrar:
Resultado: Hola <script>alert('XSS')</script>
ese código se ejecutará en el navegador, causando el ataque.
Cómo suelen explotarlo
- Campos de búsqueda o formularios que no filtran entradas.
- Parámetros que se insertan directamente en el DOM sin escaping.
- HTML generado dinámicamente con datos sin validar.
- Usar funciones peligrosas como
innerHTML con contenido de usuarios.
Prevención práctica
- Escapar siempre el contenido dinámico: antes de insertarlo en HTML, sustituye caracteres como
<, >, &.
- Implementar Content Security Policy (CSP): limita qué scripts pueden ejecutarse y desde dónde, reduciendo riesgos.
- Validar y filtrar entradas: usar expresiones regulares para aceptar solo caracteres esperados, evitar scripts.
- Evitar usar funciones peligrosas: como
eval() o manipular innerHTML con datos inseguros.
- Usar frameworks modernos: React, Angular o Vue escapan datos automáticamente, minimizando riesgos.
- Separar datos y código: nunca mezcles directamente el input de usuario con el código HTML o JS sin saneamiento.
Consecuencias graves
- Robo de cookies o tokens, permitiendo suplantar sesiones.
- Phishing o manipulación visual de la página para engañar usuarios.
- Instalación de malware o redirecciones maliciosas.
- Control completo del navegador de la víctima, incluso con acceso a cámara o micrófono si se explota junto con otros bugs.
Errores comunes que generan XSS
- No usar funciones de escaping para el output HTML.
- Confiar en validaciones solo del lado cliente (JavaScript).
- Insertar contenido del usuario directamente en atributos HTML o URLs sin sanitización.
- Permitir HTML o JavaScript en comentarios o inputs sin filtrar.
Ejemplo de código vulnerable en JavaScript
const userInput = location.search.split('q=')[1];
document.getElementById('result').innerHTML = "Resultado: " + userInput;
Si userInput no se filtra, un atacante puede inyectar etiquetas <script> y ejecutar código.
Recomendaciones finales
- Aplica escaping en el servidor y en el cliente.
- Usa políticas CSP estrictas y evita cargar scripts externos inseguros.
- Actualiza librerías y frameworks para corregir fallos conocidos.
- Haz pruebas frecuentes de seguridad, como usar escáneres y pentesting para detectar XSS.
← Volver al inicio