Formulaire d'upload et la sécurité

Publié le 21 mars 2009 par Avi Teboul

Permettre à vos visiteurs d'envoyer des fichiers sur votre serveur est une opération beaucoup plus délicate qu'il n'y parait si le processus n'est pas totalement maitrisé. "Anéfé", c'est sans doute le point d'entrée préféré et privilégié des pirates, puisqu'il peut éventuellement permettre d'envoyer des scripts sur votre serveur et les exécuter, lui permettant éventuellement de glaner des informations comme vos accès à votre base de données. Cette attaque, par envoi de fichier via un formulaire, est sans doute l'une des plus dangereuse car elle donne une très grande liberté pour l'attaquant.


Je vais donc vous montrer, par un exemple concret, les choses à faire lorsque vous devez gérer un envoi de fichiers, mais surtout... les choses à ne pas faire !

Pour illustrer cet article, je vais utiliser un exemple très simple et très courant. Imaginons que vous gérez un site avec un forum, et que vous voulez permettre à vos internautes de pouvoir envoyer leurs images via un script qui leurs donnera simplement le code à insérer sur le forum pour ajouter ces images à leurs messages. Ce script va répondre aux règles de gestion suivantes :


- Seuls les fichiers aux les extensions jpg,jpeg,png,gif seront autorisés
- Vérification du type Mime du fichier (signature qui indique le type du fichier), image/jpeg etc... (si cela est possible bien sur)
- L'image ne pourra pas faire plus de 2Mo
- Le nom de l'image de destination sera de la forme : [nom d'origine]_[nombre aléatoire de 6 chiffre].[extension d'origine]


Globalement, la plupart des développeurs vont considérer que ces règles sont suffisantes pour sécuriser votre script, et pourtant... Il est très loin de l'être. Première chose sur laquelle il faut être méfiant, c'est les images au format GIF, "Anéfé" celui-ci a une particularité par rapport à d'autres formats, c'est qu'en ouvrant l'image avec un éditeur de texte, on peut ajouter n'importe quel code que l'on souhaite à la fin de celui-ci sans que cela n'altère l'affichage de l'image. Votre fichier vérolé passe donc toutes les règles de gestion, extension .gif autorisé, type mime image/gif, moins de 2Mo... A partir de ce constat, il ne faut en aucun cas que votre serveur PHP soit configuré pour interpréter le contenu des fichiers GIF, sinon vous pourrez très bien vous retrouver avec des images contenant du code malicieux qui vous sera difficile de localiser puisque l'affichage de l'image n'est pas altéré. Alors oui, très peu de serveurs sont configurés de la sorte, sauf qu'il est tout de même possible de faire interpréter cette image même si PHP n'est pas configuré pour !


En effet, Apache a un comportement avec les extensions qui pourra surprendre plus d'une personne dans l'assemblée, et tout repose sur le système de renommage adopté dans les règles de gestions. J'ai donc mon image GIF qui se nomme pour l'instant "hack.gif" et qui contient par exemple, un code PHP qui va aller chercher un gestionnaire de fichiers sur un serveur distant et l'installer sur l'hôte. Pour que PHP interprète cette image comme un script PHP on va simplement... Changer son nom, et appeler cette image "hack.php.gif.gif", une fois cette image envoyée elle portera le nom suivant : hack.php.gif_012345.gif. Il ne vous reste plus qu'à ouvrir cette image dans votre navigateur, et comme par magie, le code PHP va être exécuté ! En fait il n'y a rien de magique, sous Linux on peut avoir des extensions "multiples", comme par exemple le ".tar.gz", ici nous avons le même principe et le fichier comporte donc 3 extensions ".php.gif_012345.gif". Apache détecte que l'une des extensions du fichier est .php, et hop cela part dans la moulinette de PHP.


Conclusion : Vérifier les extensions, c'est nécessaire mais pas suffisant, vérifier le type mime, c'est nécessaire mais cela peut être contourné (Et pas seulement avec l'exemple du format GIF), mais surtout il ne faut jamais garder le nom d'origine dans le nom du fichier de destination et renommez plutôt de la façon suivante : [UNIQUID].[EXT].

Les dernieres videos de buzz

Voir les dernieres videos