Injections XXE
L’injection d’entité externe XML (XXE) est une vulnérabilité web qui permet à un attaquant d’interférer avec le traitement des données XML par une application.
Cas d’usage
Une attaque par injection XXE peut se réaliser dans plusieurs contextes et avec des objectifs différents. On recense ainsi plusieurs cas :
- Inclusion de fichiers arbitraires : l’entité externe est définie pour inclure le contenu d’un fichier du serveur, pour que ce dernier soit retourné côté client.
- Réalisation de SSRF : l’entité externe est définie sur la base d’une URL vers le serveur.
- Exfiltration de données : comme pour le premier point, mais les données sont cette fois transmises à un système contrôlé par l’attaquant.
Pour réaliser ces attaques, il faut être en mesure d’interférer avec le contenu XML qu’une application envoie au serveur pour traitement.
Types d’attaques XXE
Inclusion de fichiers arbitraires
Pour inclure un fichier local du serveur, il existe deux biais pour la modification du XML :
- Introduire un élément DOCTYPE qui définit une entité externe contenant le chemin d’accès au fichier ;
- Modifier une valeur XML renvoyée dans la réponse de l’application, afin d’utiliser l’entité externe définie.
Exemple avec une application qui vérifie le niveau du stock de produit avec du XML :
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
Avec la possibilité d’altérer ce code et sans contrôle de l’application, il serait possible de récupérer le contenu du fichier /etc/passwd
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
L’entité définie est xxe
, et sa valeur est le contenu du fichier /etc/passwd
. Cette entité est ensuite appelée au sein de la valeur productId
. Ainsi l’application va reconnaître la variable, la rechercher dans les entités déclarées et inclure sa valeur dans la réponse HTTP.
Réalisation de SSRF
Dans la mesure où un serveur peut interprêter de l’XML, il est possible de lui demander d’effectuer des requêtes HTTP sur des URL que l’on va lui transmettre. Par exemple, le code suivant déclenche une requête vers le site example.org
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://example.org/"> ]>
Blind XXE
XInclude Statement
Certaines applications reçoivent des données transmises par le client, les intègrent côté serveur dans un document XML, puis analysent le document. Dans ce cas, il n’est pas possible de faire une attaque XXE classique, car on ne contrôle pas l’ensemble du document XML. Cependant, on peut utiliser XInclude à la place, il s’agit d’une spécification permettant de construire un document XML à partir de sous-documents. On peut alors placer une XInclude dans n’importe quelle valeur de données d’un document XML.
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>