<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
**La plupart de ces informations sont basées sur cette incroyable page de Portswigger :** [**https://portswigger.net/web-security/xxe/xml-entities**](https://portswigger.net/web-security/xxe/xml-entities)
Le langage de balisage extensible, communément abrégé en XML, est défini comme un langage de balisage utilisé pour le stockage et le transport de données. En utilisant une structure rappelant un arbre, composée de balises et de données similaires à HTML, XML se distingue en ne se limitant pas à des balises prédéfinies. Cette flexibilité permet l'utilisation de balises nommées de manière descriptive selon les données qu'elles encapsulent. Historiquement, XML a gagné en importance en tant que format de transport de données, notamment représenté par sa contribution à l'acronyme "AJAX" (où "X" signifie "XML"). Cependant, sa popularité a diminué, JSON émergeant comme le format préféré.
### Représentation des éléments de données en XML à travers les entités <a href="#representation-of-data-items-in-xml-through-entities" id="representation-of-data-items-in-xml-through-entities"></a>
En XML, les entités servent de mécanismes pour représenter des éléments de données dans un document, offrant une alternative à l'insertion directe de données. La spécification XML intègre diverses entités intégrées. Par exemple, `<` et `>` servent à représenter respectivement les caractères `<` et `>`. En raison de leur rôle dans la délimitation des balises XML, ces métacaractères doivent souvent être représentés à l'aide d'entités lorsqu'ils doivent apparaître dans les données.
Les déclarations de type d'élément sont essentielles en XML, car elles établissent les directives pour la présence, les types et le séquençage des éléments dans un document XML. Des exemples illustratifs incluent :
-`<!ELEMENT stockCheck ANY>` signifie que l'élément `<stockCheck></stockCheck>` peut contenir n'importe quel type d'objet.
-`<!ELEMENT stockCheck EMPTY>` indique que l'élément `<stockCheck></stockCheck>` doit rester vide.
-`<!ELEMENT stockCheck (productId,storeId)>` spécifie que l'élément `<stockCheck>` peut uniquement contenir `<productId>` et `<storeId>` en tant qu'éléments enfants.
### Introduction à la définition de type de document <a href="#introduction-to-document-type-definition" id="introduction-to-document-type-definition"></a>
La définition de type de document (DTD) joue un rôle crucial en XML en fournissant des déclarations qui peuvent dicter la structure d'un document XML, les types de données autorisés, et plus encore. L'élément `DOCTYPE`, qui est facultatif et positionné au début d'un document XML, peut déclarer une DTD. Les DTD peuvent être catégorisées comme "internes" lorsqu'elles sont entièrement intégrées dans un document, "externes" lorsqu'elles sont chargées à partir d'une source externe, ou une combinaison des deux.
Les entités externes en XML sont un sous-type d'entités personnalisées, caractérisées par leurs définitions externes à la DTD. Ces entités utilisent le mot-clé `SYSTEM` et nécessitent une URL spécifiant l'emplacement à partir duquel la valeur de l'entité doit être récupérée, permettant potentiellement les [attaques par entité externe XML](https://portswigger.net/web-security/xxe).
Dans les scénarios où les entités standard sont inefficaces pour exploiter les vulnérabilités XXE en raison de la validation ou du renforcement du parseur XML, les entités de paramètres XML peuvent être utilisées. Distinguées par l'inclusion d'un caractère de pourcentage précédant le nom de l'entité et référencées en utilisant le même caractère, les entités de paramètres XML sont exclusivement référencées dans la DTD. Elles peuvent faciliter la détection de XXE aveugle par des méthodes hors bande, comme l'initiation d'une recherche DNS et d'une requête HTTP vers un domaine contrôlé par l'attaquant, confirmant ainsi le succès de l'exploit.
**[La plupart de ces attaques ont été testées en utilisant les excellents laboratoires XEE de Portswiggers : https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)**
Dans les applications basées sur **Java**, il pourrait être possible de **list the contents of a directory** via XXE with a payload like (just asking for the directory instead of the file):
En utilisant la **technique précédemment commentée**, vous pouvez amener le serveur à accéder à un serveur que vous contrôlez pour montrer sa vulnérabilité. 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 des **entités de paramètres XML**:
**Dans ce cas, nous allons faire en sorte que le serveur charge un nouveau DTD avec une charge utile malveillante 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://**_**). Cette explication est basée sur le** [**laboratoire de Portswigger ici**](https://portswigger.net/web-security/xxe/blind)**.**
- 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, transmettant le contenu de l'entité `%file` dans la chaîne de requête de l'URL.
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 à partir du 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.
**Dans ce cas, nous allons faire en sorte que le serveur charge un DTD malveillant qui affichera le contenu d'un fichier à l'intérieur d'un message d'erreur (ceci est uniquement valable si vous pouvez voir les messages d'erreur).** [**Exemple ici.**](https://portswigger.net/web-security/xxe/blind)
Vous pouvez déclencher un message d'erreur de parsing XML contenant le contenu du fichier `/etc/passwd` en utilisant un DTD externe malveillant comme suit:
* Définit une entité de paramètre XML appelée `file`, contenant le contenu du fichier `/etc/passwd`.
* Définit une entité de paramètre XML appelée `eval`, contenant une déclaration dynamique d'une autre entité de paramètre XML appelée `error`. L'entité `error` sera évaluée en chargeant un fichier inexistant dont le nom contient la valeur de l'entité `file`.
* Utilise l'entité `eval`, ce qui provoque l'exécution de la déclaration dynamique de l'entité `error`.
* Utilise l'entité `error`, de sorte que sa valeur soit évaluée en tentant de charger le fichier inexistant, ce qui entraîne un message d'erreur contenant le nom du fichier inexistant, qui est le contenu du fichier `/etc/passwd`.
_**Veuillez noter que le DTD externe nous permet d'inclure une entité à l'intérieur de la seconde (****`eval`****), mais c'est interdit dans le DTD interne. Par conséquent, vous ne pouvez pas forcer une erreur sans utiliser un DTD externe (généralement).**_
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 des entités déclarées de manière externe, facilitant l'exécution d'attaques XXE basées sur les erreurs. De telles attaques exploitent la redéfinition d'une entité de paramètre XML, initialement déclarée dans un DTD externe, à partir d'un DTD interne. Lorsque les connexions hors bande sont bloquées par le serveur, les attaquants doivent se fier aux fichiers DTD locaux pour mener l'attaque, visant à induire une erreur d'analyse pour révéler des informations sensibles.
Considérons 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 d'analyse XML révélant le contenu du fichier `/etc/passwd` en soumettant un DTD hybride comme suit:
- 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 une [exploitation XXE basée sur les erreurs](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 d'analyse, exposant le contenu du fichier `/etc/passwd`.
- En utilisant l'entité `local_dtd`, le DTD externe est engagé, englobant la `custom_entity` nouvellement définie. Cette séquence d'actions provoque 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`
Comme cette technique utilise un **DTD interne, vous devez d'abord en trouver un valide**. Vous pourriez le faire en **installant** le même **OS / logiciel** que celui utilisé par le serveur et en **recherchant quelques DTD par défaut**, ou en **récupérant une liste** de **DTD par défaut** à l'intérieur des systèmes et en **vérifiant** s'il en existe un :
De plus, si vous avez **l'image Docker du système victime**, vous pouvez utiliser l'outil du même dépôt pour **analyser** 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 faire.
Pour une explication plus approfondie de cette attaque, **consultez la deuxième section de [cet article incroyable](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) de Detectify**.
La capacité de **télécharger des documents Microsoft Office est proposée par de nombreuses applications web**, qui procèdent ensuite à l'extraction de certaines informations de ces documents. Par exemple, une application web peut permettre aux utilisateurs d'importer des données en téléchargeant une feuille de calcul au format XLSX. Afin que l'analyseur puisse extraire les données de la feuille de calcul, 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 une charge utile 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é (tel que vim). Le XML doit être modifié pour inclure la charge utile XXE souhaitée, commençant souvent par une requête HTTP.
Les lignes XML modifiées doivent être insérées entre les deux objets XML racine. Il est important de remplacer l'URL par une URL pouvant être surveillée 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é vers l'application web potentiellement vulnérable, et on peut espérer qu'une requête apparaisse dans les journaux de collaborateur de Burp.
Le protocole `jar` est uniquement disponible sur les **applications Java**. Il permet d'accéder aux fichiers à l'intérieur d'un fichier **PKZIP** (`.zip`, `.jar`, ...) et fonctionne pour les fichiers locaux et distants :
Pour pouvoir accéder aux fichiers à l'intérieur des fichiers PKZIP est **très utile pour abuser des XXE via les fichiers DTD système.** Consultez [cette section pour apprendre comment abuser des fichiers DTD système](xxe-xee-xml-external-entity.md#error-based-system-dtd).
Notez qu'il est possible d'interrompre le flux à la deuxième étape. Le truc est de ne jamais fermer la connexion lors de la fourniture du fichier. [Ces outils peuvent être utiles](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) : un en python `slow_http_server.py` et un en java `slowserver.jar`.
Une fois que le serveur a téléchargé votre fichier, vous devez trouver son emplacement en parcourant le répertoire temporaire. Étant aléatoire, le chemin du fichier ne peut pas être prédit à l'avance.
Écrire des fichiers dans un répertoire temporaire peut aider à **escalader une autre vulnérabilité qui implique une traversée de chemin** (comme l'inclusion de fichiers locaux, l'injection de modèles, la RCE XSLT, la désérialisation, etc).
Dans certains scénarios, **les données envoyées par le client sont incorporées dans un document XML par des processus côté serveur avant l'analyse**. Cela se produit généralement lorsque les données client sont intégrées dans une **requête SOAP backend**, gérée ultérieurement par un service SOAP côté serveur.
Mener une attaque XXE traditionnelle (XML External Entity) s'avère difficile dans ces cas en raison du contrôle limité sur l'ensemble du document XML, en particulier de l'incapacité à modifier ou introduire un élément `DOCTYPE`. Cependant, en exploitant `XInclude`, une fonctionnalité de la norme XML qui permet l'assemblage d'un document XML à partir de sous-documents plus petits, présente une solution de contournement. Cette approche permet une attaque `XInclude` dans n'importe quel élément de données d'un document XML, la rendant réalisable dans les cas où le contrôle est restreint à une pièce de données individuelle intégrée dans un document XML généré par le serveur.
Pour lancer une attaque `XInclude`, l'inclusion de l'espace de noms `XInclude` est requise, ainsi que la spécification du chemin de fichier destiné à l'inclusion. L'exemple suivant illustre comment une telle attaque pourrait être structurée:
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 contenant du XML sont gérés. Des formats de fichiers courants tels que les documents de bureau (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 qui s'attendent à 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).
Dans les deux cas, le format SVG est utilisé pour lancer des attaques exploitant les capacités de traitement XML du logiciel du serveur, soulignant ainsi la nécessité d'une validation d'entrée robuste et de mesures de sécurité.
**Notez que la première ligne du fichier lu ou du résultat de l'exécution apparaîtra À L'INTÉRIEUR de l'image créée. Vous devez donc pouvoir accéder à l'image créée par SVG.**
Si une requête POST accepte les données au format XML, vous pourriez essayer d'exploiter une XXE dans cette requête. Par exemple, si une requête normale contient ce qui suit :
Pour modifier la requête, vous pourriez 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:
Vous pouvez utiliser la \[**"Recette d'encodage**" 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.
Si le site web utilise PHP, au lieu d'utiliser `file:/`, vous pouvez utiliser les **enveloppes php**`php://filter/convert.base64-encode/resource=` pour **accéder aux fichiers internes**.
Notez que les **Entités HTML** 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)).
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).
{"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."}
Cela 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é de récupérer des fichiers contenant un caractère de nouvelle ligne, tel que /etc/passwd, en utilisant la technique Out of Band.
Pour surmonter cette limitation, une approche basée sur les erreurs est utilisée. Le fichier DTD est structuré comme suit pour déclencher une erreur qui inclut des données d'un fichier cible:
Le serveur répond avec une erreur, indiquant de manière importante le fichier inexistant, ce qui indique que le serveur tente d'accéder au fichier spécifié:
Cette modification conduit à l'exfiltration réussie du contenu du fichier, comme le reflète la sortie d'erreur envoyée via HTTP. Cela indique une attaque XXE (Entité Externe XML) réussie, exploitant à la fois les techniques Out of Band et Error-Based pour extraire des informations sensibles.
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.
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/)\
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.