Sécuriser un formulaire PHP d’upload

Un billet concernant les formulaires d’Upload pour ceux qui souhaiteraient en ajouter sur leurs sites.
En effet, un formulaire mal programmé qui ne prend pas certaines précautions ou qui est mal installé peut permettre de pirater votre site.
Au minimum, voici quelques précautions qui sont à prendre, à savoir :

  • Bannir certaines extensions pour prévenir l’envoi de certains types de fichiers.
  • Vérifier le type MIME et renommer les fichiers de destinations
  • Sécuriser le répertoire où sont stockés les fichiers

Bannir certaines extensions de fichiers

Voici le formulaire d’upload


avec du code très basique :

Ici on peut envoyer un fichier PHP, qui sera interprété par le serveur.
Cela signifie que l’on peut envoyer un Shell PHP et donc prendre le contrôle du serveur.
Bien entendu pour cela, il faut que le pirate connaisse le répertoire de destination, ce qui est en général pas difficile car il porte des noms communs comme : upload / up / fichiers / files.
Un bruteforce peut permettre de trouver le répertoire de destination.

Vérifier le type MIME et/ou Renommer les fichiers de destination

La première précaution consiste à vérifier le type MIME du fichier uploadé et filtrer les extensions.
Eventuellement renommer le fichier de destination en supprimant notamment les extensions.
Le fait de renommer en supprimant l’extension permet de se protéger, dans le cas où le pirate trouve une astuce pour envoyer un fichier avec une extension .PHP.
On peut par exemple renommer avec le MD5 du fichier, la date du fichier et des caractères aléatoires etc.

Bien entendu, il faut créer une base de données qui permet de faire la correspondance.
Lors de la récupération du fichier, il faudra envoyer dans le header le type de fichier et aller chercher le nom du fichier sur le serveur.

Admettons que vous avez le code suivant qui n’autorise que l’envoi de fichier GIF :

J’ai fait quelques essais,
Si on envoie un fichier avec une extension  GIF, on a bien image/gif
Si on envoie un fichier avec une extension GIF avec du code PHP à la fin, il n’est pas interprété.
Si on envoie un fichier PHP avec le contenu GIF et le codo PHP à la fin, au moment de l’uploader $_FILES[« file »][« type »] application\octet-stream qui ne devrait pas passer.

D’autre part, j’ai pris un fichier GIF avec le contenu PHP et il n’est pas interprété par le serveur.

Ce qui devrait donc empêcher d’uploader du code PHP – néanmoins il est déconseillé de ne vérifier QUE le type MIME.
Filtrer aussi les extensions de fichiers.

Dans le cas d’un filtrage par extension, Il est plutôt conseillé d’autoriser les extensions que de bloquer certaines extensions car vous risquez d’oublier des extensions qui peuvent jouer sur la sécurité (par exemple .PHP3)

Exemple :

De même par exemple, si vous souhaitez n’avoir que des images, vous pouvez interdire le type MIME application\octet-stream

Sécuriser le répertoire de destination

Au niveau du répertoire de destination où sont stockés les fichiers uploadés, il est conseillé :

  • d’empêcher de lister le contenu du répertoire
  • désactiver PHP
  • éventuellement ajouter une authentification ou mettre en forbidden via la directive deny.

Tout ceci peut se faire via un fichier .htaccess pour désactiver PHP, il faut ajouter la directive : php_flag engine off

Par exemple avec notre fichier test.php, ce dernier n’est plus interprété, on voit le contenu de ce dernier.

 

Conclusion

Comme vous pouvez le voir,  il est important de ne pas pouvoir uploader un fichier avec l’extension .PHP et de pouvoir l’atteindre.
Si c’est le cas, un internaute peut faire ce qu’il veut avec votre serveur.
Si vous comptez installer un formulaire d’Upload, il convient de faire quelques vérifications, il en va de la sécurité de votre serveur.

Le minimum est de filtrer sur les extensions et d’empêcher l’accès aux répertoires/fichiers uploadés. L’internaute doit y accéder par une page PHP dont vous mettez à disposition le téléchargement du fichier en construisant le header de la requête GET.

Comment lire d'autres tutoriels de malekal.com ?

Si le site vous a aidé, svp, débloquez les bloqueurs de publicités, n'hésitez pas non plus à partager l'article ou le site sur les réseaux sociaux.

Pour pouvoir lire plus d'articles et tutoriels, utilisez le menu en haut du site. Plein d'articles et tutos utiles vous attendent !

Besoin d'aide ?

Posez votre question ou soumettez votre problème sur le forum malekal.com pour obtenir une aide efficace : Aller sur le forum malekal.com
(Visited 223 times, 2 visits today)

4 thoughts on “Sécuriser un formulaire PHP d’upload

  1. Trés bon article sur un probléme trop souvent ignoré.

    Je rejouterais également que le type mime ($_FILES[« file »][« type »]) et determiné par le navigateur de l’utilisateur (en-tête Content-Type) et peut étre facilement falsifié.

    Si celui-ci devait absolument servir d’indicateur alors il serait préférable de le déterminer soit-même coté serveur (avec FILEINFO_MIME).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *