Sécurité : basename

En ce qui concerne la sécurité lors de l’utilisation du système de fichiers, la fonction basename de PHP fait vite parler d’elle. Elle permet d’extraire uniquement le nom du fichier dans une chaîne de caractères.

Par exemple, utilisons le code ci-dessous qui permet de télécharger un fichier passé grâce à la méthode GET :

<?php
$path = '/mes_fichiers/';
$file = $_GET['file'];
readfile($path.$file);
?>

Ce code, très simple, affiche le contenu d’un fichier. Mais voilà … il a une énorme faille.

Vous ne la voyez pas ? Essayer d’appeler le script de la façon suivante : « le_script.php?file=../index.php ». En jetant à nouveau un coup d’œil au script, on voit que la fonction readfile est appelée de la façon suivante :

readfile('/mes_fichiers/../index.php');

Ce qui est équivalent au code suivante :

reafile('/index.php');

La faille

En jonglant entre « /../ » et « /nom_d_un_dossier/ », un pirate peut se balader dans toute l’arborescence de votre site web. Pire encore, si vous n’avez pas bloqué PHP dans un dossier, un pirate peut accéder à l’ensemble de votre disque dur.

Dans le cas où PHP est limité à un dossier (et ses sous-dossiers), le problème que vous risquez d’avoir est que le pirate accède à un fichier de configuration du genre « bdd.conf.php » qui contient, bien évidement, des informations à hauts risques.

La solution

Comme l’indique le nom de cet article, la fonction qui va nous sauvez la vie est « basename ». Cet fonction retourne uniquement le nom du fichier. Ainsi, « /../../fichier.php » deviendra « fichier.php » et nous aurons gagner !

<?php
$path = '/mes_fichiers/';
$file = basename($_GET['file']);
readfile($path.$file);
?>

En reprenant l’exemple de tentative d’attaque vu plus haut, nous avons :

//$_GET['file'] = '../index.php';
$file = basename($_GET['file'];
// équivalent à $file = 'index.php';

Et le tour est joué.

Tagués avec : , , , , ,
Publié dans Sécurité

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*