XML External Entity (XXE) Injection
Inyección de Entidades Externas XML (XXE)
Descripción
La inyección XXE (XML External Entity) es un fallo de seguridad crítico que surge cuando una aplicación analiza entradas XML de fuentes no confiables sin la validación adecuada. Los atacantes explotan esta vulnerabilidad inyectando entidades externas en los datos XML, lo que potencialmente puede llevar a un acceso no autorizado a archivos o directorios confidenciales en el servidor, como /etc/passwd. Esta brecha puede permitir a los adversarios extraer información confidencial, interrumpir la funcionalidad de la aplicación o ejecutar código arbitrario. Las vulnerabilidades XXE comúnmente ocurren debido a una validación de entrada deficiente y a la mala configuración de los analizadores XML, permitiendo que entidades maliciosas manipulen las estructuras XML.
Ejemplos
Java
//Input example :
String xmlInput = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE foo [<!ENTITY xxe SYSTEM \"file:///etc/passwd\">]>\n" +
"<foo>&xxe;</foo>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xmlInput.getBytes()));
// Process the XML document
// Access the parsed data, which could potentially include sensitive information
Javascript
const app = require("express")();
const libxml = require("libxmljs");
app.post("/path", (req, res) => {
Element = libxml.parseXml(req.body, { noent: true });
// Processing the XML element
});
Php
<?php
$xmlInput = '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>';
$doc = new DOMDocument();
$doc->loadXML($xmlInput);
echo $doc->saveXML();
?>
Recomendación
Para mitigar el riesgo de vulnerabilidades de entidades externas XML, se recomienda:
- Deshabilitar la resolución de entidades externas.
- Deshabilitar el soporte para XInclude.
//Input example :
String xmlInput = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE foo [<!ENTITY xxe SYSTEM \"file:///etc/passwd\">]>\n" +
"<foo>&xxe;</foo>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Enable secure processing mode to mitigate common XML security vulnerabilities
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
// Disable external DTDs and stylesheets to prevent potential XXE attacks
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xmlInput.getBytes()));
const app = require("express")();
const libxml = require("libxmljs");
app.post("/path", (req, res) => {
Element = libxml.parseXml(req.body);
// Processing the XML element
});
<?php
$loadEntities = libxml_disable_entity_loader(true);
$xmlInput = '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>';
$doc = new DOMDocument();
$doc->loadXML($xmlInput);
libxml_disable_entity_loader($loadEntities);
echo $doc->saveXML();
?>
Enlaces
Estándares
- CWE_TOP_25:
- CWE_611
- GDPR:
- ART_25
- ART_32
- PCI_STANDARDS:
- REQ_6_4
- REQ_6_5
- SOC2_CONTROLS:
- CC_2_1
- CC_3_4
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213
- SECURITY255