XSS Basado en DOM
Scripts maliciosos ejecutados al leer datos controlados por el atacante de la URL o APIs del navegador y escribirlos en el DOM usando sinks peligrosos como innerHTML o document.write.
Cómo Funciona
DOM XSS ocurre completamente en el navegador — sin involucrar al servidor. La URL de ataque contiene un payload en el fragmento hash o query string. Tu JavaScript lo lee con `location.hash` o `URLSearchParams` y lo escribe en el DOM. El servidor nunca ve el payload malicioso, lo que hace inútil la sanitización server-side.
// MAL: parámetro URL escrito directo al DOM
const message = new URLSearchParams(location.search).get('msg');
document.getElementById('notificacion').innerHTML = message;
// URL: /pagina?msg=<img src=x onerror=alert(document.cookie)>// BIEN: usa textContent para texto plano, DOMPurify para HTML
const message = new URLSearchParams(location.search).get('msg') ?? '';
// Para texto plano:
document.getElementById('notificacion').textContent = message;
// Para contenido HTML:
import DOMPurify from 'dompurify';
document.getElementById('notificacion').innerHTML = DOMPurify.sanitize(message);Ejemplo Real
DOM XSS es el tipo más común de XSS en SPAs modernas. Google pagó $7,500 por un DOM XSS encontrado en sus resultados de búsqueda. Los frameworks de JavaScript como React escapan texto por defecto, pero los desarrolladores que usan dangerouslySetInnerHTML o manipulación directa del DOM se saltan esas protecciones.
Cómo Prevenirlo
- Usa textContent o innerText en lugar de innerHTML cuando insertas texto plano
- Cuando se necesita HTML, sanitiza con DOMPurify antes de la inserción
- Evita document.write() por completo — está deprecado y es peligroso
- Habilita un CSP estricto para mitigar el daño si ocurre XSS
- En React: nunca uses dangerouslySetInnerHTML sin DOMPurify
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
XSS Almacenado
highContenido provisto por el usuario guardado en la base de datos sin sanitizar y renderizado en el navegador como HTML, permitiendo inyección de scripts persistente que se ejecuta para cada usuario que ve el contenido.
PostMessage Sin Verificar Origen
mediumHandlers de window.addEventListener('message') que procesan mensajes sin verificar event.origin, permitiendo que cualquier sitio web envíe comandos al handler de mensajes de tu app.
Clickjacking Avanzado
mediumAusencia de los headers X-Frame-Options y CSP frame-ancestors, combinada con sin lógica de frame-busting en el cliente, dejando la app completamente embebible en iframes maliciosos.
Iframe Sin Atributo Sandbox
mediumContenido de terceros o generado por el usuario cargado en un iframe sin el atributo sandbox, permitiendo que ese contenido ejecute scripts, acceda a cookies del padre y navegue el frame de nivel superior.