LFI - Local File Inclusion

3,438 views

Published on

LFI (Local File Inclusion) Comment détecter, exploiter et se protéger

Published in: Education
1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total views
3,438
On SlideShare
0
From Embeds
0
Number of Embeds
653
Actions
Shares
0
Downloads
29
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

LFI - Local File Inclusion

  1. 1. Par Emir Fares BELMAHDI @The_Crzay3D emir.belmahdi@gmail.com www.rpg-exploit.com Fb.com/groups/cscclub www.csc-club.org
  2. 2.  Cette présentation est à but éducatif, vous êtes le seul responsable de vos actes, notez que la loi condamne toute intrusion dans un système informatique
  3. 3. PHP est un langage de programmation interprété qui s'intègre dans vos pages HTML. Il permet entre autres de rendre automatiques des tâches répétitives, notamment grâce à la communication avec une base de données
  4. 4. Exemple de code PHP <?php echo "Bonjour, je suis un script PHP !"; ?> Ou même :              <?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) { ?> <h3>strpos() n'a pas retourné FALSE</h3> <p>Vous utilisez Internet Explorer</p> <?php } else { ?> <h3>strpos() a retourné FALSE</h3> <p>Vous n'utilisez pas Internet Explorer</p> <?php } ?>
  5. 5. L'instruction de langage include inclut et exécute le fichier spécifié en argument. Exemple : vars.php <?php  $couleur = 'verte';  $fruit = 'pomme';  ?> test.php       <?php echo "Une $fruit $couleur"; // Une include 'vars.php'; echo "Une $fruit $couleur"; // Une pomme verte ?>
  6. 6. Plusieurs variables prédéfinies en PHP sont "superglobales", ce qui signifie qu'elles sont disponibles quel que soit le contexte du script. Il est inutile de faire global $variable; avant d'y accéder dans les fonctions ou les méthodes. Les variables superglobales sont :          $GLOBALS $_SERVER $_GET $_POST $_FILES $_COOKIE $_SESSION $_REQUEST $_ENV
  7. 7.  $_GET ◦ Un tableau associatif des valeurs passées au script courant via les paramètres d'URL. ◦ http://www.google.dz/search?q=SDW  $_POST. ◦ Un tableau associatif des valeurs passées au script courant via le protocole HTTP et la méthode POST. ◦ Exemple : Les informations transmises via formulaire d’inscription/Connexion
  8. 8.  $_REQUEST ◦ Un tableau associatif qui contient par défaut le contenu des variables $_GET, $_POST et $_COOKIE. ◦ Les variables contenues dans $_REQUEST sont fournies au script via les mécanismes d'entrée GET, POST, et COOKIE et donc, peuvent être modifiées par l'utilisateur final ; aussi, vous ne pouvez faire confiance à leur contenu. La présence ainsi que l'ordre de ces variables dans ce tableau sont définis suivant la directive de configuration variables_order.
  9. 9.  Local File Inclusion (également connu sous le nom LFI) est le processus d'inclusion de fichiers sur un serveur via le navigateur web. Cette vulnérabilité survient lorsque une page n'est pas correctement protégé, et permet l’injection des caractères du Directory Traversal ( .. Et /)
  10. 10.  Exemple 1 : (Mauvaise conception) ◦ <?php include($_REQUEST["page"]); ?>  Exemple 2 : (Mauvaise conception) ◦ <?php if isset($_REQUEST["page"]) { $page = $_REQUEST["page"]; include(“$page.php”); } ?>  Exemple 3 : (Une meilleure conception) ◦ <?php if isset($_GET["page"]) { //remove any attempts at directory traversal $page = str_replace(‘../’, ‘’, $_GET ["page"]; include(“$page.php”); }?>
  11. 11.  Même Notre 3ème exemple est vulnérable, bien que les caractères de LFI sont remplacé. On peut évader ce filtre en encodant les caractères en hexadécimal : ◦ http://www.site.com/index.php?page=..%2F..%2F..%2F..%2F etc%2Fpasswd  Le « .php » peut être éliminer en empoisonnant l’url avec un « null byte » 0x00 (%00) ◦ http://www.site.com/index.php?page=..%2F..%2F..%2F..%2F etc%2Fpasswd%00
  12. 12.  Maintenant que l’on sait que LFI nous permet d’interpréter et d’exécuter des fichiers locaux contenant du code PHP, quel est le risque ? ◦ On peut inclure n’importe quel fichier (accessible par l’utilisateur actuel), pensez à un shell se situant dans le dossier /tmp ◦ On peut utiliser la LFI afin de télécharger un fichier sur le serveur (un backdoor par exemple)
  13. 13. LFI – Logs Apache Vert : IP Source, Rouge : URL, Bleu : User-Agent
  14. 14.   Cette technique consiste à empoisonner les logs apache de sorte à injecter du code PHP dans le fichier « access_log » (ou autre, tout dépends du serveur), en utilisant : le UserAgent, requête HTTP Telnet, curl/wget ou même un simple navigateur. Il ne reste plus qu’à inclure les logs d’accès avec notre LFI (exemple : http://www.site.com/index.php?page=../../.. /../../../etc/httpd/logs/access_log%00)
  15. 15.  En utilisant l’addon Firefox (Live HTTP Headers) on injecte du code PHP dans le user-agent qui sera ensuite sauvegardé dans les logs apache
  16. 16.  Vous pouvez également utiliser Telnet pour envoyer une requête HTTP malveillante
  17. 17.  Maintenant il ne reste plus qu’à inclure les logs apache, ainsi le code php sera exécuté grâce à la fonction include
  18. 18.   On peut aussi utiliser « /proc/self/environ » afin d’injecter du code PHP et exécuter des commandes sur le serveur, on peut même aller jusqu’à créer un fichier qui nous permettra de télécharger d’autres fichiers sur le serveur (un formulaire upload) Notez la présence du « User-Agent » dans l’image qui suit …
  19. 19. LFI - Exemples
  20. 20.   Nous allons donc refaire les mêmes étapes et empoisonner le User-Agent de sorte a ce qu’il contient un code PHP (voir l’exemple précédent) Un petit programme qui permet d’exploiter cette faille existe, je vous invite à visiter les liens ci-dessous ◦ http://www.youtube.com/watch?v=IDSP2768jEQ ◦ http://pastebin.com/RDY7zW0X
  21. 21.    Une autre technique d’exploitation consiste à inclure les session PHP (souvent dans /tmp, parfois dans /var/lib/php5) Vous pouvez essayer de déterminer votre sessionid grâce aux cookies du navigateur Il ne vous restera plus qu’à modifier le contenu des sessions et les inclure sous la forme de sess_[votre_phpsessid]
  22. 22.  Une autre méthode pour exécuter du code PHP grâce à une LFI est tout simplement l’utilisation d’un formulaire upload (celui pour ajouter votre avatar par exemple), en modifiant l’extension un fichier php en .jpg/.png/.bmp … etc vous pouvez l’upload sur le serveur et ainsi inclure cette image (bien-sûr elle contient un code malveillant) et voilà !!
  23. 23.   Vous devez maintenant savoir qu’en utilisant une LFI les scripts PHP sont exécutés, hum … que doit-on faire afin d’éviter que les pages soient interprétés? Rien de très difficile, il suffit simplement d’utiliser les Filtres PHP
  24. 24.     L’utilisation de filtres PHP est une manière assez simple afin de bypass d’exécution des scripts PHP en utilisant une LFI Exemple : http://192.168.1.50/select.php?page=php://filt er/read=convert.base64encode/resource=index.php Grâce a ce filtre la page index.php sera encodé en base64 avant son inclusion, ce qui empêche l’exécution du code PHP A vous après de la décoder afin de récupérer le contenu.
  25. 25. LFI – Les Filtres PHP Au lieux d’exécuter le code php le serveur nous renvoi le contenu de la page encodée en base64
  26. 26.    Pour savoir si un dossier existe grâce à une LFI il faut tout simplement faire comme ceci http://192.168.1.50/select.php?page=../../.. /../../../var/nom_dossier/../../etc/passwd Si l’inclusion de « /etc/passwd » se fait correctement c’est que le dossier existe.
  27. 27.     Vous pouvez utiliser une LFI afin d’essayer de gagner un accès root. Commencez par réunir un maximum d’informations sur le serveur par exemple la distribution sur la quelle le serveur tourne (/etc/issue). Essayez ensuite d’upload un shell sur le serveur (dans n’importe quel dossier modifiable) puis tenter de l’inclure. Créez une reverse connexion afin de travailler à l’aise
  28. 28.    Maintenant qu’on a un accès au serveur il suffit de tenter l’élévation des privilèges Utilisez vos privilèges utilisateur pour avoir quelques informations sur les programmes en cours d’exécution Direction (www.1337day.com / www.exploitdb.com) et cherchez un local root exploit, un petit script qui exploite une vulnérabilité en rapport avec l’un des processus en cours d’exécution.
  29. 29.     Activer magic_quotes Configurer open_basedir afin de ne permettre l’accès « read » que sur le dossier web et /tmp Filtrer les caractères de LFI (‘..’, ‘/’ ,’%00’) Utiliser les includes statiques si possible ◦ <?php If ($_GET['file'] == 'mypage'){include('mypage.php');}; ?> ◦ (vous pouvez également utiliser ‘switch’ à la place de ‘if’
  30. 30.   Voilà c’est le ‘The End’ si vous avez des questions n’hésitez pas. Liens utiles : http://www.owasp-dz.org/forum/showthread.php?tid=5 http://www.blackhatlibrary.net/File_Inclusion https://www.owasp.org/index.php/Path_Traversal http://www.enigmagroup.org/articles/view/Linux%20Hacki ng/115-LFI-Apache-log-poisoning ◦ http://evilzone.org/tutorials/local-file-inclusion-(lfi)/ ◦ ◦ ◦ ◦
  31. 31. Par Emir Fares BELMAHDI @The_Crzay3D emir.belmahdi@gmail.com www.rpg-exploit.com Fb.com/groups/cscclub www.csc-club.org

×