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>
  1. Paso 1: El atacante envía este documento XML al servidor.

  2. Paso 2: Si el servidor no está configurado correctamente, resolverá la entidad &xxe; y devolverá el contenido del archivo /etc/passwd al atacante.

  3. 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 de xml.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?