highCWE-79A03:2021

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.

Código Vulnerable
// 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)>
Código Seguro
// 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

ReactNext.jsjavascript

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas