XXE (XML External Entity)
🌐 Vulnerabilidad: XML External Entity (XXE)
🕵️♂️ ¿Qué es XXE?
XML External Entity (XXE) es una vulnerabilidad que afecta aplicaciones que procesan datos XML. Ocurre cuando una aplicación permite incluir referencias a entidades externas dentro de un documento XML, lo que puede ser explotado por un atacante para:
Acceder a archivos locales del servidor.
Realizar ataques SSRF (Server-Side Request Forgery).
Filtrar información confidencial.
En casos extremos, ejecutar código remoto o causar una denegación de servicio (DoS).
⚙️ ¿Cómo se produce?
Cuando una aplicación no deshabilita las entidades externas al procesar XML, un atacante puede inyectar una referencia maliciosa en un documento XML enviado al servidor.
🛠️ Mecanismo de ataque
Ejemplo de archivo XML malicioso:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<credentials>
<username>&xxe;</username>
<password>password</password>
</credentials>
Paso 1: El atacante envía este documento XML al servidor.
Paso 2: Si el servidor no está configurado correctamente, resolverá la entidad
&xxe;
y devolverá el contenido del archivo/etc/passwd
al atacante.Paso 3: El atacante obtiene acceso a datos sensibles.
🎯 Impacto
Exposición de archivos locales: Como contraseñas, claves privadas o configuraciones.
Ataques SSRF: Manipulación para que el servidor realice solicitudes a servicios internos o externos.
Denegación de servicio (DoS): Uso de entidades recursivas para consumir recursos del servidor.
Ejecución remota de código (RCE): En algunos casos, puede permitir la ejecución de comandos.
📉 Puntaje CVSS v3
Vector de ataque: Red (se explota remotamente)
Complejidad del ataque: Baja
Impacto en la confidencialidad: Alto
Impacto en la integridad: Medio
Impacto en la disponibilidad: Bajo a alto (dependiendo del ataque)
Puntaje CVSS v3: 7.5 - 9.0 (Crítico) 🔥
🧑💻 Ejemplo práctico
Código vulnerable en PHP (procesamiento XML):
<?php
$xml = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xml); // Procesa el XML sin restricciones
$data = simplexml_import_dom($dom);
echo $data->username;
?>
Solicitud de ataque:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<credentials>
<username>&xxe;</username>
<password>password</password>
</credentials>
📌 Si no se deshabilitan las entidades externas, el servidor devolverá el contenido del archivo /etc/passwd
.
🛡️ ¿Cómo prevenir XXE?
1️⃣ Deshabilitar entidades externas
Configura las bibliotecas XML para deshabilitar la carga de entidades externas:
En PHP:
libxml_disable_entity_loader(true);
2️⃣ Validación del formato del XML
Valida el XML recibido para asegurarte de que no incluya referencias a entidades externas.
3️⃣ Usar bibliotecas seguras
Utiliza bibliotecas modernas que no permiten el procesamiento de entidades externas por defecto:
Python: Usa
defusedxml
en lugar dexml.etree.ElementTree
.Java: Configura
DocumentBuilderFactory
para deshabilitar DTD:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
4️⃣ Uso de herramientas de validación
Implementa WAF (Web Application Firewall) o herramientas de validación que bloqueen contenido XML malicioso.
5️⃣ Evitar procesamiento innecesario
Si no es necesario procesar entradas XML, evita habilitar funcionalidades relacionadas con XML.
💡 Dato extra: Aunque XXE está clasificado en el OWASP Top 10, la mayoría de las vulnerabilidades pueden prevenirse simplemente configurando adecuadamente las bibliotecas XML.
🚨 Nota importante: XXE no solo compromete la confidencialidad del servidor, sino que puede ser utilizado como un pivote para acceder a redes internas.
Última actualización
¿Te fue útil?