LFI - Local File Inclusion
-
Upload
emir-fares-belmahdi -
Category
Education
-
view
2.326 -
download
4
description
Transcript of LFI - Local File Inclusion
Par Emir Fares BELMAHDI
Fb.com/groups/cscclub
www.csc-club.org
@The_Crzay3D
www.rpg-exploit.com
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
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
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 } ?>
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 ?>
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
$_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
$_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.
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 /)
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”);
}?>
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
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)
Vert : IP Source, Rouge : URL, Bleu : User-Agent
LFI – Logs Apache
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)
En utilisant l’addon Firefox (Live HTTP Headers) on injecte du codePHP dans le user-agentqui sera ensuitesauvegardédans les logsapache
Vous pouvez également utiliser Telnet pour envoyer une requête HTTP malveillante
Maintenant il ne reste plus qu’à inclure les logs apache, ainsi le code php sera exécuté grâce à la fonction include
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 …
LFI - Exemples
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
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]
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à !!
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
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.
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
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.
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
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.
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’
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)/
Par Emir Fares BELMAHDI
Fb.com/groups/cscclub
www.csc-club.org
@The_Crzay3D
www.rpg-exploit.com