Parte: 4 — Seguridad de aplicaciones web · Fuente: The Web Application Hacker's Handbook / Real-World Bug Hunting (Yaworski) ⏱️ Duración estimada: 120 min · Nivel: Avanzado
Dominar las dos variantes de XSS más peligrosas: el almacenado (stored), que persiste y afecta a todos los usuarios, y el basado en DOM, que ocurre íntegramente en el navegador. Aprenderás a rastrear el flujo de datos desde la fuente (source) hasta el punto de ejecución (sink).
⚠️ Ética: solo en labs propios/autorizados. El stored XSS puede afectar a otros usuarios, así que nunca lo pruebes en producción ajena.
Al finalizar, el alumno podrá:
innerHTML, eval, document.write).| # | Tema | Por qué importa |
|---|---|---|
| 1 | Stored XSS: persistencia | Afecta a múltiples usuarios |
| 2 | DOM XSS: sources y sinks | Ocurre sin tocar el servidor |
| 3 | Sinks peligrosos en JS | Dónde se ejecuta el código |
| 4 | XSS en frameworks (React/Angular) | Riesgos residuales modernos |
| 5 | Exploits accionables (CSRF vía XSS) | Impacto real más allá del alert |
| 6 | Sanitización con DOMPurify | Defensa práctica en cliente |
| 7 | Trusted Types y CSP | Defensa de plataforma |
location.hash, document.referrer). Característica: origen del dato no confiable.innerHTML, eval). Característica: punto donde detona el XSS.⚠️ Solo en labs propios.
<img src=x onerror=alert(1)>.element.innerHTML = location.hash.slice(1).#hash y confirma la ejecución.alert, haz que el script realice una acción autenticada (cambiar email) en el lab.dangerouslySetInnerHTML lo reintroduce.Logra un XSS almacenado en Juice Shop que ejecute una acción en nombre de otro usuario (no solo alert), y luego propón la corrección con sanitización.
Criterio de aceptación: demuestras el payload persistente disparándose en una segunda sesión y realizando una acción, e identificas el source, el sink y la defensa concreta.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| El payload se guarda pero no ejecuta | Se codifica al renderizar; busca otro campo/sink |
| DOM XSS no reproduce | El source no es controlable en ese flujo; revisa el JS |
| React "no permite" XSS | dangerouslySetInnerHTML o refs manuales lo reintroducen |
| DOMPurify no bloquea | Config permisiva; revisa allowlist de tags/atributos |
| alert salta solo para ti | Contexto de sesión; prueba en pestaña anónima |
❓ ¿Los frameworks modernos eliminan el XSS? Reducen mucho el riesgo por escapado automático, pero APIs de escape manual y DOM XSS siguen siendo posibles.
❓ ¿Cómo encuentro DOM XSS? Rastrea sources y sinks en el JavaScript. Herramientas como DOM Invader (de Burp) ayudan a automatizarlo.
❓ ¿Sanitizar en cliente o servidor? Ambos, según el caso. Para HTML enriquecido en el cliente, DOMPurify; en el servidor, codificación de salida por contexto.
Clase 096 — Cross-Site Scripting (XSS) reflejado