• 4 heures
  • Facile

La faille include

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Explications

La faille include est également très dangereuse. Comme son nom l'indique, elle exploite une mauvaise utilisation de la fonctioninclude() . Cette fonction est très souvent utilisée pour exécuter du code PHP se situant dans une autre page, et particulièrement pour la connexion à une base de données. Par exemple :

<?php include('config.php'); ?>

La page config.php contient les variables avec les renseignements de connexion à la base de données. Avant tout, il faut savoir que cette faille est extrêmement dangereuse, car le hacker peut se servir de cette négligence pour faire ce qui lui plaît comme modifier, supprimer, changer les droits... Il peut également forcer l'affichage de votre code PHP. Autant vous dire que vous avez tout intérêt à vous en protéger ! Il existe de très nombreux types de failleinclude() , et de très nombreux moyens d'exploiter cette fonction. Mais je ne suis pas ici pour faire de vous des pirates professionnels, mais bien pour vous expliquer les dangers de ces failles et vous montrer comment vous en protéger. Nous ne verrons donc ici que deux types de faille include.

La faille include à distance

C'est la faille include par excellence. C'est à la fois la plus rencontrée, et la plus facilement exploitable. Imaginons une page index.php contant :

<?php include($_GET['fichier']); ?>

Maintenant un exemple d'URL exploitant cette partie du code :

www.monsite.com/index.php?fichier=default.php

Dans ce cas la page default.php est incluse dans la page index.php. Imaginez alors que quelqu'un d'amuser à changer default.php par www.openclassroom.com. Le site OpenClassrooms s'exécutera alors sur le serveur de votre site et s'affichera au beau milieu de votre page index.php. Un peu bancal pas vrai ? Surtout si on considère que la personne peut s'amuser à inclure une "backdoor"  sur votre serveur, et là ça devient un peu plus embêtant. 21

La faille include en local

Bon comme vous l'avez remarqué, nous nous sommes jusqu'à présent contenté d'inclure des fichiers distants, c'est-à-dire contenus sur un autre serveur que celui du site web. Mais il est également possible d'utiliser cette faille pour inclure des fichiers qui se trouvent sur le serveur du site et ainsi de les exploiter. Nous allons également pouvoir nous balader dans les différents répertoires du site voire même dans les répertoires du serveur ! Un personne malintentionnée va donc pouvoir retrouver le fichier contenant les passwords (ou autre), sans trop de difficultés. Il pourra également forcer l'affichage de votre code PHP et donc voir les mots de passe pour la base de données qui sont en clair dans votre code.

Moi j'ai hashé mes mots de passe en sha1 donc même s'ils récupèrent la liste ils ne pourront rien en tirer, si ?

Même si un hash n'est pas réversible comme un chiffrement, il existe aujourd'hui des techniques pour casser ces fameux hash. Je ne vais pas m'attarder là-dessus pour l'instant, je consacrerai une partie entièrement dédiée à la protection des donnés plus tard dans ce cours.

Comment s'en protéger

Pour commencer, je vous conseille de tester la présence de la faille include sur votre site. Pour cela rien de plus simple, il vous suffit d'essayer d'inclure une page qui n'existe pas. Si l'URL en question est vulnérable, vous obtiendrez un message d'erreur de la part de PHP. Cette faille est déjà plus complexe à protéger, dans la mesure où on ne peut pas complètement interdire l'inclusion sur le site (car sinon on ne pourra pas inclure nos propres fichiers). Il faut donc savoir au préalable ce que l'on veut inclure, rédiger un htaccess qui veille sur les fichiers importants.

Voilà un petit code qui va vous permettre d'inclure un fichier local en toute sécurité :

<?php

if (empty($page)) {
 $page = "accueil";
 // On limite l'inclusion aux fichiers.php en ajoutant dynamiquement l'extension
 // On supprime également d'éventuels espaces
 $page = trim($page.".php");

}

// On évite les caractères qui permettent de naviguer dans les répertoires
$page = str_replace("../","protect",$page);
$page = str_replace(";","protect",$page);
$page = str_replace("%","protect",$page);

// On interdit l'inclusion de dossiers protégés par htaccess
if (preg_match("admin",$page)) {
 echo "Vous n'avez pas accès à ce répertoire";
 }

else {

    // On vérifie que la page est bien sur le serveur
    if (file_exists($page) && $page != 'index.php') {
       include("./".$page); 
    }

    else {
        echo "Page inexistante !";
    }

?>

Je vous l'accorde, c'est beaucoup de code pour inclure un fichier, mais c'est le prix à payer pour être correctement protégé. 13

Exemple de certificat de réussite
Exemple de certificat de réussite