Descubrimiento de XSS

🧠 Introducción al Descubrimiento XSS

A estas alturas ya deberíamos comprender:

🧠 Idea clave

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

🖥️ Escáneres de vulnerabilidades web

Casi todos los escáneres modernos detectan XSS, como:

Estos suelen realizar dos tipos de escaneo:


🔍 Escaneo Pasivo

📚 Recurso recomendado:
https://portswigger.net/web-security/cross-site-scripting/dom-based


⚔️ Escaneo Activo

📚 Recurso OWASP:
https://owasp.org/www-community/attacks/xss/


🧰 Herramientas Open Source para XSS

🧪 Alternativas gratuitas

Aunque las herramientas de pago suelen ser más precisas, existen buenas opciones open-source:

Estas herramientas suelen:

⚠️ Importante

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

✅ Resultado

El parámetro task fue identificado como potencialmente vulnerable a XSS.

📌 Siempre prueba el payload manualmente para confirmar.


✍️ Descubrimiento Manual

🧠 Enfoque manual

La dificultad depende directamente del nivel de seguridad de la aplicación.


🧨 Pruebas con Payloads XSS

El método más básico consiste en:

📚 Recursos recomendados:


ℹ️ Nota importante

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?

🧠 Razones comunes

  • 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

⚠️ Copiar/pegar payloads NO es eficiente

⚙️ Automatización personalizada

🛠️ En casos avanzados

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)

🚨 Método más preciso

La revisión manual de código es la forma más fiable de detectar XSS.

Debe incluir:

Si entendemos:

👉 Podemos crear payloads a medida con alta probabilidad de éxito.

📚 Recursos de apoyo:


🧩 Relación con Source & Sink

📘 Recordatorio

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

📌 Claves del Descubrimiento XSS

  • 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

  1. Página de login:
    {F3E9DC50-BC9D-4A89-AFEF-6FB92E3EAA52}.png

  2. 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
    {9C60DFCA-EDF9-4662-AED0-5EC19E3A852B}.png

  3. Ejecutar XSStrike:

    python xsstrike.py -u "http://<IP>:<port>/?fullname=a&username=b&password=b&email=example%40gmail.com"
    
  4. Encontramos que email es vulnerable:
    {28B780D1-4E86-4676-908A-58EF0F960EBC} 1.png

  5. Inyectamos payload XSS:

    http://83.136.253.132:56567/?fullname=a&username=a&password=a&email=%3Cscript%3Ealert(window.origin)%3C/script%3E
    
  6. Resultado: alerta ejecutada
    {D2BFA07C-1110-4C6E-8C4B-03B6F6AB3318}.png

  7. Verificación en código fuente:
    {9227F6E5-CEED-44F1-99F9-760D819B075F}.png

✅ Conclusión: XSS Reflected detectad