Principes et Défense des Vulnérabilités XXE: Un Guide Complet de Sécurité

Aujourd'hui, explorons le sujet des injections d'entités externes XML (XXE). Que vous soyez novice en sécurité ou ingénieur pentester expérimenté, comprendre les injections XXE est crucial. Plongeons ensemble dans cette faille de sécurité à la fois fascinante et dangereuse!

Rappels sur les bases du XML

Imaginons que XML est comme un livre de recettes avec un format spécifique. Chaque recette (document XML) comprend les éléments suivants:

  • Informations de couverture (déclaration XML) : vous indique de quel type de livre il s'agit et dans quel langage il est rédigé.
  • Table des matières (DTD) : explique la structure du livre, ce que chaque chapitre devrait contenir.
  • Contenu des recettes (élément documentaire) : informations réelles sur les plats.

Par exemple, une simple recette de "riz sauté aux œufs" en XML pourrait ressembler à ceci :

<?xml version="1.0" encoding="UTF-8"?>

  <!ELEMENT ingredients (#PCDATA)>
  <!ELEMENT steps (#PCDATA)>
]>
<recipe>
  <name>Riz sauté aux œufs</name>
  <ingredients>Riz, œufs, ciboulette, huile, sel</ingredients>
  <steps>1. Battre les œufs 2. Faire sauter les œufs 3. Ajouter le riz 4. Remuer 5. Assaisonner</steps>
</recipe>

Introduction aux entités XML

Les entités XML sont comme des "raccourcis" ou des macros dans une recette. Elles permettent de faire référence rapidement à du contenu fréquemment utilisé sans avoir à le réécrire à chaque fois.

Imgainez que vous rédigez un livre de recettes de cuisine chinoise. Vous pourriez souvent utiliser l'expression "ajouter du sel pour assaisonner". Vous pouvez créer une entité pour remplacer cette phrase courante :

<!ENTITY seasoning "ajouter du sel pour assaisonner">   

Puis, utilisez &seasoning; là où c'est nécessaire.

XML contient principalement trois types de "raccourcis" :

  • Entités internes : comme des abréviations dans le livre.
  • Entités externes : comme la référence à d'autres livres ou ressources externes.
  • Entités de paramètres : abréviations spécifiques utilisables uniquement dans la "table des matières" (DTD).

Principe des injections XXE

Imaginez que vous utilisez une application intelligente de recettes. Cette application permet aux utilisateurs de télécharger leurs propres recettes, puis les analyse et affiche automatiquement.

Normalement, les utilisateurs téléchargeraient des recettes similaires à l'exemple de riz sauté aux œufs. Cependant, un utilisateur malveillant décide de télécharger une "recette" spéciale :

<?xml version="1.0" encoding="UTF-8"?>
]>
<recipe>
  <name>Recette mystérieuse</name>
  <ingredients>&xxe;</ingredients>
</recipe>

Cette "recette" semble normale, mais elle contient une entité externe &xxe; qui référence le fichier /etc/passwd sur le serveur.

Si l'application n'implémente pas les mesures de sécurité appropriées lors de l'analyse de ce XML, elle pourrait lire le contenu du fichier /etc/passwd et l'afficher dans la section "ingrédients" ! C'est le principe de base d'une attaque par injection XXE.

L'attaquant est comme un enfant espiègle qui découvre un "mot magique" dans le livre de recettes, permettant au livre de s'ouvrir automatiquement à d'autres pages non pertinentes. Si le créateur du livre n'est pas prudent, cela pourrait exposer des informations qui ne devraient pas être visibles par les lecteurs.

Types d'attaques XXE

Les types courants d'attaques XXE comprennent :

  • Lecture de fichiers arbitraires
  • Exécution d'attaques SSRF (Server-Side Request Forgery)
  • Balayage de ports internes
  • Attaques de déni de service

Examinons quelques cas d'attaque spécifiques.

Exemples d'attaques XXE

Lecture de fichiers locaux

Charge utile (payload) :

<?xml version="1.0" encoding="UTF-8"?>
]>
<content>&secret;</content>

Cette charge utile pourrait lire et afficher le contenu du fichier /etc/passwd du serveur.

Attaque SSRF

Charge utile :

<?xml version="1.0" encoding="UTF-8"?>
]>
<content>&secret;</content>

Cette charge utile pourrait forcer le serveur à accéder à une adresse sur le réseau interne, potentiellement divulguant des informations sensibles.

Balayage de ports internes

Charge utile :

<?xml version="1.0" encoding="UTF-8"?>
]>
<content>&secret;</content>

En modifiant l'adresse IP et le port, l'attaquant peut détecter les ports ouverts sur le réseau interne.

Mesures de défense contre XXE

Pour se protéger contre les attaques XXE, on peut mettre en œuvre les mesures suivantes :

  • Désactiver l'analyse des entités externes
  • Utiliser des analyseurs XML sécurisés
  • Filtrer les caractères spéciaux dans les entrées utilisateur
  • Utiliser les dernières bibliothèques de traitement XML et appliquer les correctifs rapidement

En PHP, on peut utiliser le code suivant pour désactiver les entités externes :

libxml_disable_entity_loader(true);   

Conclusion

L'injection XXE est une faille de sécurité Web courante et potentiellement très dommageable. En tant que professionnels de la sécurité, nous devons comprendre en profondeur son principe, maîtriser les techniques d'attaque et de défense. Parallèlement, en tant que développeurs, nous devons prêter attention à la sécurité lors de l'analyse de XML dans notre développement quotidien pour prévenir les problèmes.

Rappelez-vous que la sécurité n'est pas un acquis, elle nécessite un apprentissage et une pratique continus. Cet article devrait vous aider à mieux comprendre les injections XXE et à améliorer votre conscience et vos compétences en matière de sécurité.

Étiquettes: XML XXE sécurité web injection entités externes

Publié le 30 mai à 19h00