Sécurité des applications Web - Menaces et contre-mesures

Auteur: Mohamed CHINY Durée necessaire pour le cours de Sécurité des applications Web - Menaces et contre-mesures Niveau recommandé pour le cours de Sécurité des applications Web - Menaces et contre-mesures Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 14: Vulnérabilité XXE (XML eXternal Entities)

Toutes les pages

La vulnérabilité XXE (XML eXternal Entities)

Principe de l'attaque XXE

La vulnérabilité XXE (pour XML eXternal Entities) est une faille de sécurité qui pourrait figurer dans les applications Web qui reposent dans leur fonctionnement sur des documents XML.

XML (ou eXtensible Markup Langage) est un format de données structurées en balises dont la structure globale ressemble au langage HTML. XML est surtout utilisé pour échanger les données entre des systèmes différents, mais il sert aussi au stockage de données. En effet, nombreuses sont les applications (notamment Web) qui reposent sur le stockage de leurs données dans des documents XML, en particulier les applications Web fait en AJAX (Asynchronous Javascript And XML).

Un document XML peut ressembler à ceci:
<?xml version="1.0" encoding="UTF-8" ?>
<cours>
   <chapitre>
      <nom>HTML</nom>
      <nbr_heures>20</nbr_heures>
   </chapitre>
   <chapitre>
      <nom>HTML5</nom>
      <nbr_heures>12</nbr_heures>
   </chapitre>
   <chapitre>
      <nom>CSS</nom>
      <nbr_heures>20</nbr_heures>
   </chapitre>
</cours>
Afin d'éviter la redondance de valeurs dans un document XML, on recourt aux entités. Les entités sont considérées comme des variables qui peuvent être initialisées avec une valeur au choix. Cette valeur sera ensuite appliquée partout où l'entité est déclarée.

A titre d'exemple, imaginons que l'on souhaite remplacer la valeur 20 (qui figure deux fois dans le document XML) par une entité nommée valeur. Notre code XML ressemblera donc à ceci:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE cours [ <!ENTITY valeur "20"> ]>
<cours>
   <chapitre>
      <nom>HTML</nom>
      <nbr_heures>&valeur;</nbr_heures>
   </chapitre>
   <chapitre>
      <nom>HTML5</nom>
      <nbr_heures>12</nbr_heures>
   </chapitre>
   <chapitre>
      <nom>CSS</nom>
      <nbr_heures>&valeur;</nbr_heures>
   </chapitre>
</cours>
Il est possible, de faire référence à une entité externe de la même manière, sauf qu'au lieux de définir la valeur de l'entité statiquement, on lui associe un fichier distant (dite entité externe) qui lui attribut la valeur voulue (sans oublié de préfixer l'entité par le mot-clé SYSTEM) comme ceci:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE cours [ <!ENTITY valeur SYSTEM "file://chemin_vers_le_fichier_qui_initie_la_valeur"> ]>
<cours>
   <chapitre>
      <nom>HTML</nom>
      <nbr_heures>&valeur;</nbr_heures>
   </chapitre>
   <chapitre>
      <nom>HTML5</nom>
      <nbr_heures>12</nbr_heures>
   </chapitre>
   <chapitre>
      <nom>CSS</nom>
      <nbr_heures>&valeur;</nbr_heures>
   </chapitre>
</cours>
Par conséquent, si le pirate parvient à manipuler le fichier XML (d'ailleurs le fichier XML est généralement une ressource exposée, donc accessible en public), alors il pourrait injecter un lien vers un fichier critique comme /etc/passwd ou tout autre fichier qui pourrait contenir des données confidentielles (il pourrait également s'agir du fichier qui contient la chaîne de connexion à la base de données).

L'exploitation de la vulnérabilité XXE pourrait:
  • Afficher des données confidentielles comme les mots de passe ou données relatives à la vie privée des utilisateurs
  • Exécuter frauduleusement le contenu d'un fichier qui, naturellement, n'est pas accessible en temps normal

Comment se protéger d'une attaque qui cible la vulnérabilité XXE?

Au niveau du code source

Comme d'habitude, la cause de la plupart des problèmes provient de l'absence ou de l'insuffisance de vérification des entrées d'une application Web. Par conséquent, si on passe au peigne fin toute les données provenant de l'extérieur (présumés hostiles), alors cela réduira considérablement le risque d'intrusion.

Au niveau des droit sur les fichiers

Un fichier XML qui n'est utilisable qu'à travers une application Web ne doit en aucun cas être exposé. Donc, il faut faire en sorte de changer ses droits ou la portée de son exposition (à travers un simple fichier .htaccess par exemple) afin qu'il ne soit accessible que depuis le serveur et non pas depuis le navigateur.

Adopter les bonnes pratiques

Utiliser les entités XML ne constitue pas vraiment une solution inévitable. On pourrait toujours trouver des alternatives même si l'application exige l'utilisation d'un document XML, comme la génération de celui-ci à la volée à l'aide d'un code CGI (comme le PHP). De cette manière, le document sera exploitable en l'état sans avoir besoin de le parser pour remplacer les entités par leurs valeurs.
Il convient de noter que le format XML n'est plus très utilisé comme avant. D'autres formats, notamment JSON, sont plus sollicités dans de nombreuses applications qui reposent sur AJAX ou l'API Fetch.