Web Security Academy

XML external entity - Lab : Exploiting XXE via image file upload

Objectif :

  • Récupérer le contenu du fichier /etc/hostname 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 post en cliquant sur "View post".

En bas de la page, une section commentaire est présente. On peut en poster un :

On remplit tous les champs demandés et on observe la requête envoyée au serveur. L'image utilisée pour l'avatar est envoyée en clair :

On va essayer de remplacer cette donnée par une image au format SVG ( prenant en charge le format XML ) en définissant une DTD pour inclure une ressource distante ( ici /etc/hostname/ ) :

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

On prend soin de changer le Content-Type et l'extension dans le nom de l'image sur le champ filename. Ce qui donne :

On soumet la requête au serveur. Aucune erreur n'est constatée.

Ensuite, on inspecte le DOM au niveau de l'image située dans l'avatar du commentaire venant d'être posté avec le payload, pour voir comment la ressource est récupérée :

On accède à l'URL située dans l'attribut src de la balise <img> et le contenu du fichier /etc/hostname est affiché dans l'image :

Il suffit de soumettre cette valeur au lab pour le valider.