J'aimerais attirer votre attention sur une particularité du serveur web Apache que j'ai de la difficulté à m'expliquer. Quelle est l'utilité d'autoriser plusieurs extensions aux fichiers déposés sur le serveur ?
Ce que je veux dire, c'est que normalement, si un fichier se nomme cornichon.jpg, Apache déduit immédiatement que le handler par défaut qui le prendra en charge est celui pour les images. Du même coup, on s'attend à ce que page.php.jpg soit reconnu comme un jpeg. Le reste fait parti du nom de fichier. Mais la documentation d'Apache 2.2 indique qu'un fichier peut être nommé welcome.fr.html ou welcome.html.fr et qu'il ne fera pas la différence puisque l'extension .fr est inexistante et qu'aucun mime-type ne correspond. Il en déduit qu'il doit utiliser l'extension alternative, soit .html.
Ce qui, d'une certaine façon, ouvre la porte à une vulnérabilité. Supposez que vous autorisiez l'envoi de fichier sur le serveur par les visiteurs. Peut-être aurez-vous tendance à vérifier le type de fichier envoyé en comparant l'extension avec une liste d'extensions proscrites ? Vous ne désirez surement pas qu'ils puissent envoyer des fichiers .php qui s'exécuteraient sur le serveur ! Mais si le visiteur nomme son fichier page.php.code18, l'extension .code18 n'a pas de handler reconnu et Apache tentera de le résoudre en tant que script PHP. Bonjour le désastre.
Mes recommandations :
- comparer l'extension principale avec une liste d'extensions autorisées avant d'accepter le fichier (celles prises en charge par les handlers)
- vérifier le mime-type du fichier
- conserver un seul point dans le nom du fichier et remplacer les autres (par exemple avec un tiret ou un underscore)
Même problème et je fais pareil que toi ! Pour la petite anecdote, c'est un de mes visiteurs qui m'en a fait la remarque en me montrant qu'il avait réussi à accéder à un fichier assez embêtant sur mon site. (accessoirement celui contenant mes mdp de bdd)
Je n'avais jamais réfléchi à chercher dans Apache, mais c'est une idée intéressante.