lfi - local file inclusion
DESCRIPTION
LFI (Local File Inclusion) Comment détecter, exploiter et se protégerTRANSCRIPT
![Page 1: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/1.jpg)
Par Emir Fares BELMAHDI
Fb.com/groups/cscclub
www.csc-club.org
@The_Crzay3D
www.rpg-exploit.com
![Page 2: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/2.jpg)
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
![Page 3: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/3.jpg)
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
![Page 4: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/4.jpg)
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 } ?>
![Page 5: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/5.jpg)
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 ?>
![Page 6: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/6.jpg)
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
![Page 7: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/7.jpg)
$_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
![Page 8: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/8.jpg)
$_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.
![Page 9: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/9.jpg)
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 /)
![Page 10: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/10.jpg)
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”);
}?>
![Page 11: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/11.jpg)
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
![Page 12: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/12.jpg)
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)
![Page 13: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/13.jpg)
Vert : IP Source, Rouge : URL, Bleu : User-Agent
LFI – Logs Apache
![Page 14: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/14.jpg)
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 User-Agent, 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)
![Page 15: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/15.jpg)
En utilisant l’addon Firefox (Live HTTP Headers) on injecte du codePHP dans le user-agentqui sera ensuitesauvegardédans les logsapache
![Page 16: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/16.jpg)
Vous pouvez également utiliser Telnet pour envoyer une requête HTTP malveillante
![Page 17: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/17.jpg)
Maintenant il ne reste plus qu’à inclure les logs apache, ainsi le code php sera exécuté grâce à la fonction include
![Page 18: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/18.jpg)
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 …
![Page 19: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/19.jpg)
LFI - Exemples
![Page 20: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/20.jpg)
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
![Page 21: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/21.jpg)
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]
![Page 22: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/22.jpg)
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’uploadsur le serveur et ainsi inclure cette image (bien-sûr elle contient un code malveillant) et voilà !!
![Page 23: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/23.jpg)
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
![Page 24: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/24.jpg)
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://filter/read=convert.base64-encode/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.
![Page 25: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/25.jpg)
Au lieux d’exécuter le code php le serveur nous renvoi le contenu de la page encodée en base64
LFI – Les Filtres PHP
![Page 26: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/26.jpg)
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.
![Page 27: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/27.jpg)
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
![Page 28: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/28.jpg)
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.exploit-db.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.
![Page 29: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/29.jpg)
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’
![Page 30: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/30.jpg)
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%20Hacking/115-LFI-Apache-log-poisoning
◦ http://evilzone.org/tutorials/local-file-inclusion-(lfi)/
![Page 31: LFI - Local File Inclusion](https://reader034.vdocuments.site/reader034/viewer/2022042501/5560b28fd8b42af43b8b474d/html5/thumbnails/31.jpg)
Par Emir Fares BELMAHDI
Fb.com/groups/cscclub
www.csc-club.org
@The_Crzay3D
www.rpg-exploit.com