LFI - Local File Inclusion

31
Par Emir Fares BELMAHDI Fb.com/groups/cscclub www.csc-club.org @The_Crzay3D [email protected] www.rpg-exploit.com

description

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

Transcript of LFI - Local File Inclusion

Page 1: LFI - Local File Inclusion

Par Emir Fares BELMAHDI

Fb.com/groups/cscclub

www.csc-club.org

@The_Crzay3D

[email protected]

www.rpg-exploit.com

Page 2: LFI - Local File Inclusion

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

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

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

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

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

$_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

$_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

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

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

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

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

Vert : IP Source, Rouge : URL, Bleu : User-Agent

LFI – Logs Apache

Page 14: LFI - Local File Inclusion

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

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

Vous pouvez également utiliser Telnet pour envoyer une requête HTTP malveillante

Page 17: LFI - Local File Inclusion

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

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

LFI - Exemples

Page 20: LFI - Local File Inclusion

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

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

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

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

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

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

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

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

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

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

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

Par Emir Fares BELMAHDI

Fb.com/groups/cscclub

www.csc-club.org

@The_Crzay3D

[email protected]

www.rpg-exploit.com