Comprendre l'inclusion de fichiers
Plongeons dans le concept d'« inclusion de fichiers » (file inclusion) et ses vulnérabilités potentielles, spécialement conçues pour les débutants.
L'inclusion de fichiers est une pratique courante en programmation, particulièrement dans le contexte de la réutilisation de code. Les développeurs encapsulent souvent des fonctions ou des modules fréquemment utilisés dans des fichiers séparés. Lorsque ces fonctions ou modules sont nécessaires, ils incluent simplement ces fichiers dans leur code, éliminant ainsi le besoin de réécrire le même code de manière répétée.
En PHP, il existe quatre fonctions principales pour l'inclusion de fichiers :
include()
require()
include_once()
require_once()
Voici un bref aperçu de chacune :
include() : Cette fonction inclut un fichier lorsqu'elle est invoquée. Si le fichier est introuvable, PHP émet un avertissement (warning), mais le script continue de s'exécuter.
require() : Cette fonction inclut un fichier avant que le script ne commence son exécution. Si le fichier est introuvable, PHP émet une erreur fatale (fatal error) et arrête le script.
include_once() et require_once() : Ces fonctions fonctionnent de manière similaire à include() et require(), mais elles garantissent que le fichier n'est inclus qu'une seule fois, même si la fonction est appelée plusieurs fois.
Les méthodes d'inclusion de fichiers peuvent être largement classées en deux types :
- Inclusion statique (Static inclusion)
- Inclusion dynamique (Dynamic inclusion)
La distinction entre ces deux types sera clarifiée par un exemple dans les sections suivantes.
Dans notre cours, nous allons explorer trois fichiers .php situés dans le répertoire /home/labex/project/. Ce sont :
lfi_static.php
lfi_dynamic.php
echo.php
Comprendre ce que fait chaque fichier :
-
lfi_static.php : Ce fichier inclut le fichier echo.php de manière statique. En d'autres termes, le chemin d'accès au fichier echo.php est codé en dur (hard-coded) et ne change pas. Cette méthode est sécurisée et n'expose aucune vulnérabilité.
<?php
include("./echo.php");
?>
-
lfi_dynamic.php : Ce fichier inclut d'autres fichiers en fonction d'un paramètre 'file' dans l'URL. Si ce paramètre n'est pas fourni, il donne simplement une indication sur la manière de l'utiliser. Cependant, cette méthode peut être risquée si le paramètre est contrôlé par un attaquant.
<?php
if (isset($_GET['file'])) {
include($_GET['file']);
}
else{
echo "You can use the 'file' parameter to include files";
}
?>
-
echo.php : Ce fichier affiche simplement un message de succès lorsqu'il est inclus.
<?php
echo 'Great, now you have successfully included the content of echo.php!'
?>
Utilisez les commandes suivantes dans le terminal pour préparer l'image pour le test LFI :
cd ~/projects
docker build -t lfi-image .
Une fois la construction de l'image terminée, vous pouvez l'utiliser pour démarrer un conteneur afin de tester la vulnérabilité LFI :
docker run -d --name lfi -p 80:80 lfi-image
Vous pouvez maintenant tester ces fichiers dans votre navigateur. Par exemple, pour accéder au fichier lfi_static.php, vous devriez entrer l'URL suivante :
http://127.0.0.1/LFI/lfi_static.php
Vous verrez que le fichier lfi_static.php inclut avec succès le contenu de echo.php. Rappelez-vous que cette méthode statique d'inclusion de fichiers est sécurisée.
Maintenant, examinons le fichier lfi_dynamic.php. Accédez-y en utilisant cette URL :
http://127.0.0.1/LFI/lfi_dynamic.php
Vous verrez une invite vous demandant d'utiliser le paramètre 'file'. Faisons cela et incluons echo.php :
http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php
Vous verrez que echo.php est inclus avec succès. Cela démontre le fonctionnement de l'inclusion de fichiers. Il est important de se rappeler que bien qu'il s'agisse d'un exemple PHP, les principes s'appliquent à d'autres langages de programmation, même si les fonctions spécifiques utilisées peuvent différer.