XML External Entity (XXE) Injection
Injection d'Entités Externes XML (XXE)
Description
L'injection XXE (XML External Entity) est une faille de sécurité critique qui survient lorsqu'une application analyse des entrées XML provenant de sources non fiables sans validation appropriée. Les attaquants exploitent cette vulnérabilité en injectant des entités externes dans les données XML, ce qui peut potentiellement conduire à un accès non autorisé à des fichiers ou répertoires sensibles sur le serveur, tels que /etc/passwd. Cette violation peut permettre aux adversaires d'extraire des informations confidentielles, de perturber le fonctionnement de l'application ou d'exécuter du code arbitraire. Les vulnérabilités XXE se produisent généralement en raison d'une validation laxiste des entrées et d'une mauvaise configuration des analyseurs XML, permettant à des entités malveillantes de manipuler les structures XML.
Exemples
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();
?>
Recommandation
Pour atténuer le risque de vulnérabilités liées aux entités externes XML, il est recommandé de :
- Désactiver la résolution des entités externes.
- Désactiver la prise en charge de 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();
?>
Liens
Normes
- 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