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().