cd ~/blog

~/vulns/xxe-injection.md

XXE Injection

web 25-08-2025
webXXEsystem

~3 min de lectura


1. Descripción técnica del ataque

Una XXE Injection (XML External Entity Injection), ocurre cuando una aplicación web recibe y procesa datos en formato XML sin deshabilitar las entidades externas del analizador XML (parser).

Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE results [
  <!ENTITY pwned SYSTEM "file:///etc/passwd">
]>
<details>
  <email>
    &pwned;
  </email>
  <password>
    asdf
  </password>
</details>
  • La línea <!DOCTYPE results [...]> declara un DTD (Document Type Definition).

  • Dentro del DTD defines una entidad externa:

<!ENTITY pwned SYSTEM "file:///etc/passwd">

Aquí el atacante dice: “Crea una entidad llamada pwned cuyo contenido provenga del archivo /etc/passwd”.

  • Más abajo, en <email>&pwned;</email>, el parser reemplaza &pwned; por el contenido del archivo real del sistema.

Resultado: el servidor devuelve el contenido del archivo /etc/passwd dentro de la respuesta HTTP.

2. Impacto de la vulnerabilidad

Dependiendo de cómo esté configurado el parser XML y los privilegios del proceso del servidor:

  • Lectura de archivos locales, LFI (Local File Inclusion):
    Cualquier archivo accesible para el usuario del servidor (ejemplo /etc/passwd, /var/www/config.php).

  • SSRF (Server-Side Request Forgery):
    En lugar de file:///etc/passwd, un atacante puede declarar algo como:

<!ENTITY xxe SYSTEM "http://127.0.0.1:8080/admin">

Con esto el parser hace peticiones HTTP desde el servidor mismo, permitiendo escanear la red interna o interactuar con servicios que no son accesibles desde fuera.

  • Denegación de servicio (DoS):
    Mediante entidades anidadas (ataque llamado “Billion Laughs”), se puede forzar al parser a consumir memoria y CPU hasta tumbar el servicio.

  • Ejecución remota (en casos extremos):
    Si el parser admite protocolos como expect:// o php://, se puede llegar a ejecutar comandos.

3. Historia y evolución

  • 1990s – orígenes de XML: XML se diseñó como un formato flexible con capacidad de definir entidades externas para reutilización de contenido. Esto se pensó para conveniencia, no seguridad.

  • 2002-2003: se empezaron a publicar investigaciones de seguridad mostrando que los parsers de XML eran susceptibles a ataques con DTDs maliciosos.

  • 2013: OWASP incluyó XXE dentro de su lista de vulnerabilidades críticas.

  • 2017: con la publicación de OWASP Top 10 2017, XXE aparece formalmente como categoría A4:XXE, dado que en esa época explotarla era muy común en aplicaciones Java, PHP, .NET y Python que usaban librerías por defecto inseguras.

  • Actualidad: Aunque con menos presencia en frameworks modernos (porque muchos desactivan DTDs por defecto), sigue siendo un vector de ataque importante, sobre todo en aplicaciones legacy o en integraciones SOAP/XML.

4. Factores que la hacen posible

  1. El servidor recibe XML desde el cliente (Content-Type: text/plain o application/xml).

  2. El parser no está configurado en modo seguro y permite:

    • Definir entidades externas.
    • Resolver recursos externos vía file://, http://, ftp://, etc.
  3. El desarrollador no valida ni sanitiza la entrada XML antes de procesarla.

5. Detección

  • Manualmente:
    Intentando inyectar una entidad externa como <!ENTITY test SYSTEM "file:///etc/hostname"> y revisando la respuesta.

  • Automáticamente:
    Herramientas como BurpSuite (Scanner), OWASP ZAP o XXEInjector pueden detectar la vulnerabilidad.

6. Mitigación

  1. Desactivar entidades externas en el parser (la solución más efectiva).
    Ejemplo en PHP con libxml: libxml_disable_entity_loader(true);

  2. Usar librerías modernas que procesen XML de forma segura por defecto.

  3. Si no es posible desactivar completamente, aplicar whitelists de DTD permitidos.

  4. Validar y sanitizar la entrada: nunca confiar en XML recibido de clientes externos.

  5. Monitorear y auditar accesos a archivos sensibles.

7. Clasificación

  • Tipo: Inyección (Injection flaw)

  • OWASP Top 10 (2017): A4 – XML External Entities (XXE)

  • CWE: CWE-611 – Improper Restriction of XML External Entity Reference

8. Resumen

Lo que muestras es un ataque XXE clásico, usado para leer archivos locales, provocar SSRF o incluso DoS, aprovechando que el parser XML de la aplicación (en magic.php) no bloquea entidades externas. Históricamente fue muy común en servicios SOAP y en aplicaciones Java/XML, y aún hoy es relevante en entornos legacy.

// relacionados