HACKING

Les scripts d'upload

Les scripts d'upload permettent des mises à jour d'un site, c'est un logiciel FTP simplifié.
Bien entendu, pour PHP, ils sont pour la plupart destinés aux bases de bonnées MySQL.

Comme ce genre de code n'est pas des plus courants, en voici extrait simplifié :
$uploaddir = "./uploadfiles";
if(ereg("^.", "$filename_name") || ereg("[ %/,;:+~#````'$%&()?!^|][]", $filename_name))
{
...
}
elseif(file_exists("$uploaddir/$filename_name"))
{
...
}
elseif($filename_size <= $max_uploadsize)
{
copy($filename, "$uploaddir/$filename_name");
...
}


Le variable $uploaddir représente le dossier où sont stockés les fichiers uploadés.
La première condition vérifie les caractères contenus dans le fichier à uploader puis éxecute une instruction (non-visible dans cet exemple). Si au moins l'un d'eux est présent, un message erreur s'affiche expliquant l'interdiction de ces caractères.

La seconde condition vérifie que le fichier à uploader n'existe pas déjà, dans le but d'éviter d'écraser un fichier. Si c'est le cas, un message d'erreur apparait et un break stoppe la boucle.

Enfin, la dernière condition vérifie que le fichier à uploader ne dépasse pas le poid maximal aurorisé.

Si tout est ok, aucun message d'erreur ne s'affiche, le script copiera le fichier dans /uploadfiles/file.

Comme vous pouvez le constater, ce script ne vérifie pas l'extension du fichier en question. De ce fait, n'importe quel format peut être uploadé, aussi bien .txt, .jpg que .php, .cgi. Et c'est ces deux derniers qui révélent la possible utilisation d'une faille. Le pirate pourra alors faire uploader le code qu'il désire par le biais de tels fichiers et ainsi toucher le serveur.

Sachant cela, le hackeur n'aura plus qu'a créer un script utilisant la fonction copy() de PHP ce qui aura pour effet de copier le contenu d'un fichier dans un fichier texte. Cela n'a à première vue pas d'intêret, mais copier un fichier source PHP peut être trés intéressant, je pense notamment aux fichiers contenant quelques pass du site...
Par exemple, la plupart des sites utilisant PHP ont recours à des bases de données reposant sur un système classique de login/password. Pour que la connexion à la base puisse s'effectuer, le duo login/password doit obligatoirement figurer dans la page. Voici un exemple d'utilisation de copy() :
copy("index.php", "index_source.txt");

- Comment parer cette faille ?
Tout d'abord, il est conseillé de toujours préciser l'extension :
$filename=$filename . ".inc";

Ce code n'autorise que les fichier .inc.
Voici maintenant un autre exemple de sécurisation moins contraignant vus qu'il interdit certains types de fichiers et autorise les autres :
if(ereg("php$", $filename) || ereg("php3$", $filename) || ereg("cgi$", $filename)) {
echo "Format non-autorisé.";
break();
}

Ce code recherche la présence de l'extension .php puis .php3 puis .cgi dans $filename et affiche un message d'erreur si le résultat est positif. break() stoppe le script.
Une dernière méthode consisterait à faire en sorte que le hackeur n'est pas accés au répertoire d'upload (ici, /uploadfiles) en utilisant un .htaccess ou de placer le répertoire en dehors de la racine du httpd (htdocs).


<< Cours précédent - Sommaire - Cours suivant >>
Toute reproduction interdite - Intégralement écrits par le Webmaster
Valid XHTML 1.0! Valid CSS!
By Julien VAUBOURG [All right reserved] - Windows est une marque de Microsoft Corporation
Toute copie compléte comme partielle sans autorisation est passible d'amende - Avertissements