[TUTO] Faille LFI


 
Poster un nouveau sujet   Répondre au sujet    OWN3D BY KrL Index du Forum -> French - Hacking -> Hacking tutorial
Sujet précédent :: Sujet suivant  
Auteur Message
XxViRuSxX
Invité

Hors ligne




MessagePosté le: Mar 6 Juil 2010 - 10:14    Sujet du message: [TUTO] Faille LFI Répondre en citant

Tutoriel que j'ai créer sur mon propre site que je vous fait partagé !

Techniques d'exploitations d'une Local File Inclusion
Qu'est-ce qu'une Local File Inclusion?

Une Local File Inclusion (communément appelé "LFI") est une technique informatique dont le principe peut-être résumé simplement en traduisant le nom, c'est une "Inclusion de fichier local". Ce qui signifie qu'on peut inclure un fichier situé hors du dossier "Web" grâce à quelques petits trucs. Prenons comme exemple ce code PHP



Code:
 <?php include($_GET['page']);?> 


Ce code va chercher la variable "page" et essayer d'inclure et d'exécuter le fichier spécifié par cette variable. Imaginons que ce code soit mis sur l'"index.php", et que vous voulez inclure une autre page "news.php", il suffira d'aller sur "index.php?page=news.php". L'include sera lancée par le serveur, et non par le client. Pour la LFI, nous allons utiliser "../" pour remonter les dossiers jusqu'à la racine. Par exemple si nous voulons inclure le "passwd" situé dans le dossier "etc", on va remonter tout les dossiers jusqu'à la racine, ensuite se diriger vers /etc/passwd. Mettez des "../" autant de fois qu'il le faut. Une dizaine ça devrait être largement suffisant pour la plupart des cas.
http://sitelambda.com/index.php?page=../../../../../../../../../../etc/pass…

A présent, si le site est faillible vous devriez voir le fichier passwd s'inclure dans la page. Notez que l'/etc/passwd n'existe que sous les systèmes Linux, et que nous l'utilisons en général simplement parce que c'est un fichier auquel nous avons assez souvent les droits de lecture. Pour les systèmes Windows, on utilise plus souvent le C:\boot.ini .

Néanmoins, ce n'est pas suffisant, beaucoup de sites n'utilisent pas l'include de cette façon.



Code:
 <?php  include($_GET['page'].".php");?> 


Ce code-ci tentera d'inclure une page, et d'y ajouter ".php" à la fin. L'url pour inclure la fameuse page news sera "index.php?page=news". Et même ce code reste toujours faillible à une LFI, à une condition; que les "Magic Quotes" soient désactivés, vous savez, la fameuse option PHP pour transformer les ' en \' automatiquement. Si le serveur n'a pas activé les magic quotes, on va utiliser le null byte. Le null byte, c'est un caractère ayant pour valeur zéro, dans le langage C et ses dérivés, il signifie la fin d'une chaine de caractères. Il est représenté par "%00". Maintenant.. et si..
http://sitelambda.com/index.php?page=../../../../../../../../../../etc/pass…

Cet url-ci va bel et bien réussir à inclure le passwd grâce à la technique du Null byte, le ".php" que l'include va tenter d'ajouter à la fin sera supprimé grâce au null byte.
Et maintenant que j'ai une LFI, je fais quoi?

Je connais pour l'instant que trois méthodes d'exploitation des LFIs, notez que ces méthodes ne marchent pas dans tout les cas.
-L'access.log

Le principe est assez simple, mais peut devenir vite lourd à mes yeux, il consiste à inclure le fichier qui contient tout les logs du serveur Web. Le code PHP étant lancé par les includes, il suffirait juste de laisser sa trace dans ces fameux logs par exemple comme ça:



Code:
 [url=http://site.com/%3C?]http://site.com/<?[/url] phpinfo(); ?> 


Ensuite on inclut les logs, et voilà, la fonction phpinfo(); devrait être lancée. Notez cependant que souvent, les navigateurs encodent les liens que vous envoyez au serveur. "<? phpinfo(); ?>" sera affiché avec quelque chose dans le style "%3C? phpinfo(); ?%3E" (En passant, je suis pas sûr du tout de l'encode, je l'ai fait un peu comme je le sentais), du coup, le code ne sera pas exécuté même avec une inclusion. Pour pouvoir écrire du php qui sera loggué tel quel, il vous faudra coder un tool (ou quand j'en mettrais un à disposition dans la partie tools) qui ira sur la page pour vous et laissera sa trace.

Une bonne partie des sites que j'ai vu ont leur logs dans "/var/log/apache2/access.log", mais ça peut varier en fonction des systèmes, et dans les configurations d'apache, on peut même enregistrer sous un nom personnel. Si vous avez les droits, essayez d'inclure carrément le fichier de configuration apache si jamais.
-Le /proc/self/environ

Celle-ci, c'est ma préférée, même si j'ai pas eu souvent l'occasion de l'exploiter, mais en gros, faites un include de "/proc/self/environ", ce fichier contient des données sur le processus en cours (il me semble.) . Vous trouverez une ligne de ce style là: (Si vous êtes sous Firefox)



Code:
 HTTP_USER_AGENT=Mozilla/5.0 


En quoi est-ce si intéressant? En fait, avec Firefox (et peut-être d'autre navigateurs) on peut modifier son user-agent, soit via un plugin, soit manuellement. Je vais vous expliquer la méthode manuelle. Rendez-vous dans "about:config" (Tappez ça dans l'url), et créer une nouvelle ligne "Chaine de caractères" avec ces données: "general.useragent.override" et "<? phpinfo(); ?>", actualisez la page contenant l'include vers le /proc/self/environ, vous verrez le phpinfo(); apparaître par magie. En fait, le code a juste pris la place de "Mozilla/5.0" et sera exécuté.
-L'exploitation par sessions PHP

Je n'ai découvert cette exploitation que récemment, et je n'ai pas eu l'occasion de la tester, je l'ai connue grâce à Segmentation Fault, donc n'hésitez pas à y aller si jamais je ne suis pas très clair. Pour faire fonctionner cette exploitation, il vous faudra plusieurs conditions, il faudra que le site emploie les sessions, et que le contenu ne soit pas filtré dans ces sessions. Si ce site rassemble toutes ces conditions, dans le dossier /var/lib/php5/ plusieurs fichiers devraient exister, ayant comme nom SESS_[PHPSESSID] où le PHPSESSID prend le nom du cookie session. En mettant du code dans une des données de la session (le login par exemple), et en se connectant dessus, essayez d'inclure le fichier /var/lib/php5/sess_[votre session] les informations concernant votre session devraient s'afficher, avec le code lancé.
Cas particuliers

Dans certains cas, le PHP ne sera pas exécuté, souvent parce que ce n'est pas un vrai "include();" mais une autre fonction qui est utilisée, dans ces cas là, il est tout de même intéressant, car vous pouvez lire les codes PHP, donc les fichiers de configuration. Notez que le code PHP ne sera peut-être pas affiché directement sur la page, mais qu'il faudra vérifier les sources de la page (CTRL+U sur Firefox), essayez de mettre "<? echo "seraphisquad"; ?>" dans un fichier html, vous verrez qu'il ne s'affiche pas directement, regardez les sources. Ces cas ne vous permettront peut-être pas d'exécuter du code PHP, mais ils vous permettront d'accéder à autre chose, avoir les identifiants SQLs d'un fichier de configuration par exemple, et c'est tout de même énorme.
Comment se protéger des LFI?

Tout d'abord, par simple mesure de sécurité, activez les magic quotes dans les configurations de PHP. Je pense qu'une autre option indispensable est d'activer l'open_basedir sur votre dossier Web, afin d'éviter les local file inclusion hors du dossier web. Une bonne solution également, ça serait de transformer les "/" et "%2f" pour éviter tout changements de dossiers. Sinon, plus simple, faire des simples includes non-dynamiques, avec des Ifs dans le style:



Code:
 if ($_GET['page'] == "news")  {include("news.php");} else {include ("accueil.php");}  



Revenir en haut
Publicité






MessagePosté le: Mar 6 Juil 2010 - 10:14    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    OWN3D BY KrL Index du Forum ->
   Hacking tutorial
Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation