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:
<!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 comoexpect://ophp://, 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
El servidor recibe XML desde el cliente (
Content-Type: text/plainoapplication/xml).El parser no está configurado en modo seguro y permite:
- Definir entidades externas.
- Resolver recursos externos vía
file://,http://,ftp://, etc.
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 oXXEInjectorpueden detectar la vulnerabilidad.
6. Mitigación
Desactivar entidades externas en el parser (la solución más efectiva).
Ejemplo en PHP conlibxml:libxml_disable_entity_loader(true);Usar librerías modernas que procesen XML de forma segura por defecto.
Si no es posible desactivar completamente, aplicar whitelists de DTD permitidos.
Validar y sanitizar la entrada: nunca confiar en XML recibido de clientes externos.
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.