Se protéger de la faille LFI (Local File Inclusion)
Introduction : Qu’est-ce que la faille LFI
Article à destination des développeurs web et administrateurs de sites.
La faille LFI tient son nom de Local File Inclusion (Inclusion de fichier local). Elle permet à un utilisateur d’inclure des fichiers locaux (appartenant donc au serveur externe) à partir d’une URL.
Ces fichiers peuvent très bien être en dehors du répertoire racine du site web. Des fichiers sensibles comme ceux contenant des données personnelles et notamment des mots de passe peuvent donc être inclus et récupérés.
On a souvent besoin d’inclure un fichier dans une page de façon tout à fait légitime comme sur l’exemple qui suit :
http://exemple.com/vulnerable.php?page=menu.php
Seulement le fait de vérifier si ce fichier existe ne suffit pas, il faut s’assurer qu’il soit celui que l’on veut.
Notez que cette faille permet également d’exécuter du code PHP sur le serveur distant.
Que peut-on faire avec une faille LFI ?
Habituellement cette faille peut permettre de récupérer des informations comme les noms des utilisateurs de votre serveur et leurs mot de passe :
http://www.exemple.com/pagevulnerable.php?page=../../../../../../../../../../../etc/passwd
On peut également récupérer le code source d’une page php ou exécuter des commandes PHP à distance en les postant vers une url spécifique.
Dans le pire des cas, un shell php peut être installé sur votre serveur afin d’autoriser un utilisateur à exécuter des commandes à distance.
Comment savoir si mon site est faillible ?
Si votre site utilise une URL comme nous l’avons vu plus haut, il est possible qu’il soit faillible.
Voici un exemple typique de script php faillible :
<?php $fichier = $_GET['fichier']; if(isset($fichier)) { include("pages/$fichier"); //inclut le fichier si il existe } else { include("index.php"); } ?>
Par exemple, regardez si un utilisateur peut accéder aux fichiers de votre site :
http://www.exemple.com/vulnerable.php?page=../../../../../../../../fichier
Comment s’en prémunir
On va donc changer notre script précédent pour éliminer la possibilité d’utiliser « ../ » et forcer l’extension « .php »:
<?php $fichier= str_replace('../', '', $_GET['fichier']); //élimine ../ if(isset($fichier)) { //le fichier devra être inclus par son nom sans .php include("$fichier". ".php"); //ajoute ici le .php } else { include("index.php"); } ?>
Sachez cependant qu’il est possible d’utiliser l’encodage hexadécimal à la place des slashs car le navigateur les convertit correctement :
http://www.exemple.com/vulnerable.php?page=..%2F..
%2F
..%2F
..%2F
..%2Ffichier
Et il est aussi possible d’utiliser le NULL Byte pour arrêter la chaîne avant l’extension et ainsi passer outre cette restriction.
Sur les nouvelles versions de apache ce genre d’exploitation n’est maintenant plus possible car %2F et %00 ne sont pas gérés par sécurité. Cela dit vous pouvez tout de même ajouter cette ligne pour éviter à coup sûr toute faille :
$fichier= str_replace(chr(0), '', $fichier); //chr(0) étant le null byte
Une autre technique simple et radicale consiste à inclure le nom directement dans le code sans passer par l’URL mais en testant un nom à la place:
<?php if ($_GET['page'] == “news”) { include(“news.php”); } else { include (“accueil.php”); }?>
Envie d’en apprendre plus sur les failles web ?
Cette faille et bien d’autres est vue en détail dans mon cours vidéo sur les tests d’intrusion web.
Nous allons parler des fondamentaux : fonctionnement d’HTTP, d’HTTPs, de DNS et de l’architecture web de manière générale.
Nous allons également mettre en place un laboratoire de test avec des machines virtuelles pour héberger et scanner nos sites vulnérables afin d’apprendre sans rien casser.
Nous allons bien sûr parler de toutes les failles web (XSS, CSRF, SQL, LFI, RFI, …etc) en suivant le Top 10 OWASP mais aussi de tout ce qui gravite autour de la sécurité web : dénis de service, mauvaises configurations, données personnelles, reconnaissance, etc…
Impatient de commencer avec vous, je vous propose de rejoindre le cours dès maintenant : https://cyberini.com/cours/hacking-ethique-tests-intrusion-web/
5 Commentaires
Cliquez ici pour ajouter un commentaire
[…] Faille LFI / RFI […]
Bonjour ,
Je pense qu’il faut revoir cette partie : $fichier= str_replace(‘../’, », $_GET[‘fichier’]); //élimine ../
car cela n’élimine pas vraiment le ../ au cas où le payload donné est le suivant : ….//….//….//….//etc/passwd. Donc ici on arrive quand même à exploiter la faille. Il faut donc evaluer le chemin avec realpath() ou autre ;). Merci
Bien vu, merci 😉
Bonjour
Merci pour l’astuce
Sinon pour contrer les éléments répétitifs j’ai ajouté une boucle
$nbrocc=substr_count($page,’../’);
if ($nbrocc>0) {
for ($i = 1; $i <= $nbrocc; $i++) {
$page= str_replace('../', '', $page);
}
}
à priori ca devrait résoudre le cas
le if juste pour le pas faire mouliner pour rien les pages normales…
Bonjour Michel,
Si je fais mon site en Joomla, le code est-il protégé décemment ?
Bien à toi.
Marc