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 9: Upload de fichier (Faille upload)

Toutes les pages

La vulnérabilité (faille) Upload

Définition

Beaucoup de sites Web offrent la possibilité aux clients d'y uploader des fichiers comme des photos, des vidéos, des CV... Donc il ne s'agit pas vraiment d'une vulnérabilité, mais c'est le fait de ne pas contrôler ce que le client charge sur le serveur qui constitue une vulnérabilité très dangereuse.

Le principe de l'attaque est très simple. Le pirate essaie d'uploader un fichier qui contient du code malveillant ou un code PHP de sa création. Si la faille est là alors le fichier finira pas atterrir sur le serveur. Il suffit ensuite au pirate d'appeler son fichier pour que celui-ci s'exécute.

Bien entendu une telle attaque peut avoir de graves conséquences comme par exemple:
  • Espionnage des fichiers et dossiers du site
  • Accès au fichiers systèmes et fichiers confidentiels
  • Destruction ou altération de données existantes sur le serveur
  • Prise de contrôle du serveur

Exploitation

Imaginons que le site Web contient un champs d'upload de fichiers qui permet aux utilisateurs de charger leurs photos de profil. Si la vulnérabilité est là alors le pirate peut créer un document PHP du nom de crawler.php qui contient à titre d'exemple le code suivant:
$pt = opendir('/');
while($entree = readdir($pt)){
   echo $entree;   
}
closedir($pt);
Si le pirate réussit à charger ce fichier PHP sur le serveur, alors il pourra ensuite l'appeler via le navigateur en utilisant son URL comme ceci par exemple:
http://www.site-victime.php/crawler.php
Comme vous l'avez deviné, le fichier chargé va lister tous les fichiers et dossiers à la racine du site Web, ce qui n'est pas tellement dangereux. Mais le pirate aurait pu écrire un code PHP plus dévastateur.

Comment s'en protéger?

Au niveau du code PHP

Comme d'habitude, la vulnérabilité est due au mauvais contrôle des entrées de l'utilisateur, alors qu'il suffisait de vérifier si le type/Mime du fichier uploadé correspond bien à une image JPEG ou PNG en utilisant le code suivant par exemple:
<?php
   if(preg_match("#jpeg|png#",$_FILES["photo"]["type"]))
      // Accépter l'upload
   else
      echo "Format du fichier invalide.";
?>
Il faut également penser à isoler les fichiers chargés dans un dossier à part pour minimiser les risque de rebond au cas où il s'agit d'un fichier malveillant. Renommer les fichiers chargés sera aussi d'une grande utilité car le pirate aura du mal à appeler son fichier s'il ne connait pas son chemin et son nom.

Une bonne pratique consiste à changer les droits du fichier chargé à l'aide de la fonction chmod().