Descubrimiento de XSS
🧠 Introducción al Descubrimiento XSS
A estas alturas ya deberíamos comprender:
-
Qué es una vulnerabilidad XSS
-
Los tres tipos: Stored, Reflected y DOM-based
-
Cómo funciona XSS:
-
Inyección de JavaScript
-
Ejecución en el navegador del cliente
-
Detectar una vulnerabilidad puede ser tan difícil como explotarla, especialmente en aplicaciones modernas.
Aun así, debido a lo común que es XSS, existen muchas herramientas, recursos y técnicas que nos ayudan a descubrirlo.
🤖 Descubrimiento Automatizado
Casi todos los escáneres modernos detectan XSS, como:
-
Burp Suite Pro
https://portswigger.net/burp -
OWASP ZAP
https://www.zaproxy.org/
Estos suelen realizar dos tipos de escaneo:
🔍 Escaneo Pasivo
-
Analiza HTML y JavaScript
-
No envía payloads
-
Muy útil para detectar DOM-based XSS
-
Bajo ruido, bajo riesgo
📚 Recurso recomendado:
https://portswigger.net/web-security/cross-site-scripting/dom-based
⚔️ Escaneo Activo
-
Envía payloads XSS
-
Intenta forzar la ejecución de JavaScript
-
Detecta:
-
Stored XSS
-
Reflected XSS
-
-
Más intrusivo
📚 Recurso OWASP:
https://owasp.org/www-community/attacks/xss/
🧰 Herramientas Open Source para XSS
Aunque las herramientas de pago suelen ser más precisas, existen buenas opciones open-source:
-
XSStrike
https://github.com/s0md3v/XSStrike
Estas herramientas suelen:
-
Identificar campos de entrada
-
Inyectar payloads XSS
-
Comparar el HTML renderizado
-
Detectar posibles ejecuciones
Una reflexión no siempre implica ejecución real → siempre hay que verificar manualmente.
🧪 Ejemplo con XSStrike
Repositorio oficial:
https://github.com/s0md3v/XSStrike
Clonamos la herramienta:
git clone https://github.com/s0md3v/XSStrike
cd XSStrike
pip install -r requirements.txt --break-system-packages
python xsstrike.py
Ejecutamos el escaneo contra un parámetro:
python xsstrike.py -u "http://SERVER_IP:PORT/index.php?task=test"
Salida relevante:
[!] Testing parameter: task [!] Reflections found: 1 [+] Payload: <HtMl%09onPoIntERENTER+=+confirm()> [!] Efficiency: 100 [!] Confidence: 10
El parámetro task fue identificado como potencialmente vulnerable a XSS.
📌 Siempre prueba el payload manualmente para confirmar.
✍️ Descubrimiento Manual
La dificultad depende directamente del nivel de seguridad de la aplicación.
-
XSS básicos → fáciles de detectar
-
XSS avanzados → requieren revisión de código
🧨 Pruebas con Payloads XSS
El método más básico consiste en:
-
Usar listas públicas de payloads
-
Probarlos en campos de entrada
-
Observar si se ejecuta JavaScript
📚 Recursos recomendados:
-
PayloadAllTheThings – XSS
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS Injection -
PayloadBox – XSS Payload List
https://github.com/payloadbox/xss-payload-list
XSS no solo aparece en inputs HTML:
-
Cookies
-
User-Agent
-
Headers HTTP
-
Parámetros ocultos
📚 Recurso OWASP (inputs no tradicionales):
https://owasp.org/www-community/attacks/xss/
🤔 ¿Por qué muchos payloads no funcionan?
-
Están diseñados para otros contextos
-
Usan distintos vectores:
-
<script> -
<img onerror> -
CSS
-
-
Intentan evadir filtros específicos
📚 Cheatsheet útil:
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
⚙️ Automatización personalizada
Puede ser más efectivo:
-
Crear un script en Python
-
Enviar múltiples payloads
-
Comparar el HTML renderizado
-
Adaptarse a filtros específicos
📚 Ejemplo de enfoque avanzado:
https://portswigger.net/blog/xss-automation
🧑💻 Revisión de Código (La más confiable)
La revisión manual de código es la forma más fiable de detectar XSS.
Debe incluir:
-
Código back-end
-
Código front-end
Si entendemos:
-
Cómo entra la entrada
-
Cómo se procesa
-
Cómo se renderiza
👉 Podemos crear payloads a medida con alta probabilidad de éxito.
📚 Recursos de apoyo:
-
Secure Coding JavaScript (OWASP):
https://owasp.org/www-project-secure-coding-practices/ -
PortSwigger XSS Labs:
https://portswigger.net/web-security/cross-site-scripting
🧩 Relación con Source & Sink
Ya vimos esto en DOM XSS:
-
Source: de dónde viene la entrada
-
Sink: dónde se escribe en el DOM
📚 Lectura clave:
https://portswigger.net/web-security/cross-site-scripting/dom-based
Este enfoque es clave para descubrir XSS que sobreviven a auditorías automáticas.
🎯 Consideraciones Finales
-
Las herramientas ayudan, pero no son infalibles
-
Siempre verificar manualmente
-
La revisión de código es la más fiable
-
XSS avanzados requieren análisis profundo
-
Muy común en apps modernas
🧪 Ejercicio práctico: XSS Reflected
-
Página de login:

-
URL inicial tras prueba login:
http://83.136.253.132:56567/?fullname=a&username=b&password=b&email=example%40gmail.com
No hace un post sino un GET

-
Ejecutar XSStrike:
python xsstrike.py -u "http://<IP>:<port>/?fullname=a&username=b&password=b&email=example%40gmail.com" -
Encontramos que
emailes vulnerable:

-
Inyectamos payload XSS:
http://83.136.253.132:56567/?fullname=a&username=a&password=a&email=%3Cscript%3Ealert(window.origin)%3C/script%3E -
Resultado: alerta ejecutada

-
Verificación en código fuente:

✅ Conclusión: XSS Reflected detectad