Table des matières

Local File Inclusion

Description

Les LFI pour Local File Inclusion sont des vulnérabilités qui peuvent permettre à un attaquant d'inclure des fichiers locaux dans une application Web vulnérable.

Cela signifie que l'attaquant peut arbitrairement charger un fichier local présent sur le système cible, comme par exemple des fichiers de configuration, des journaux du système ou encore des fichiers contenant des informations sensibles telles que des mots de passe.

Pré-requis d'exploitation

Pour exploiter cette vulnérabilité, il est nécessaire d'avoir accès à une application Web vulnérable utilisant des fonctionnalités d'inclusion de fichiers locaux.

Connaissances nécessaires

Outils nécessaires

Flux d'exécution

Explorer

Pour identifier les endpoints et/ou pages vulnérables à une LFI, il est important de naviguer sur l'application de manière exhaustive. Les pages dynamiques qui prennent en charge les paramètres utilisateur doivent être examinées attentivement pour détecter les vulnérabilités LFI. Les points d'entrée vulnérables peuvent être identifiés en recherchant des chaînes de caractères spécifiques telles que “file=app.php” ou “inc=func”.

Expérimenter

Une fois les points d'entrée identifiés, l'attaquant peut tenter d'inclure des fichiers locaux sensibles sur le système pour extraire des informations. Les fichiers les plus couramment inclus sont les fichiers de configuration et les journaux de système. En exploitant une LFI, l'attaquant peut récupérer des informations telles que les mots de passe ou des clés d'API. L'attaquant doit ensuite analyser le comportement de l'application pour comprendre comment ces informations peuvent être exploitées pour compromettre d'avantage le système ciblé.

Exploiter

Conséquences potentielles

Une exploitation réussie de ce type de vulnérabilité peut permettre :

Contre-mesures

Les contre-mesures suivantes peuvent être mises en œuvre :

Comment cela fonctionne

Le scénario suivant peut être joué via l’exploitation de cette vulnérabilité :

Exemple 1

Voici un exemple de code PHP vulnérable à une Local File Inclusion :

<?php
    $file = $_GET['page'];
    include($file);
?>

Ce code PHP permet à un utilisateur de spécifier la page à inclure via un paramètre GET nommé “page”. Si l'attaquant peut contrôler la valeur de ce paramètre, il sera en mesure d'inclure des fichiers locaux qui ne devraient pas être accessibles, tels que des fichiers de configuration contenant des informations sensibles.

Par exemple, si l'attaquant demande la page “https://example.com/vuln.php?page=/etc/passwd”, le code PHP inclura le contenu du fichier “/etc/passwd” dans la réponse, divulguant ainsi des informations sensibles du système. Pour éviter cette vulnérabilité, il est recommandé de limiter les chemins d'accès aux fichiers inclus ou d'utiliser une fonction telle que realpath() pour valider les chemins d'accès absolus.

Exemple 2

Voici un exemple de code PHP vulnérabilité à une Local File Inclusion en null byte :

<?php
    $file = $_GET['file'];
    include('/var/www/html/' . $file . '.php');
?>

La variable $file est définie à partir de la valeur du paramètre GET nommé “file”. La fonction include() est utilisée pour inclure un fichier PHP en utilisant le chemin absolu “/var/www/html/” et le nom du fichier $file. L'extension “.php” est ajoutée à la fin de la variable $file pour s'assurer que le fichier inclus est un fichier avec l'extension “.php”.

Cependant, cette technique d'inclusion de fichiers locaux peut être vulnérable à une attaque d'inclusion avec l'utilisation d'un null byte. Un attaquant peut inclure un fichier malveillant en envoyant une valeur $file contenant un caractère null byte (\0), qui est utilisé comme marqueur de fin de chaîne de caractères. Cela peut permettre à l'attaquant d'inclure un fichier malveillant en dehors du répertoire cible.

Voici un exemple d'exploitation de cette page PHP vulnérable : https://example.com/index.php?file=../../../../../../etc/passwd%00

L'attaquant utilise le caractère null byte (%00) pour terminer la chaîne de caractères et inclure le fichier /etc/passwd situé en dehors du répertoire cible. L'utilisation à plusieurs reprises de “../” permet de remonter dans l'arborescence du système de fichiers.

Pour empêcher cette famille de LFI utilisant un null byte, il est possible d'utiliser la fonction basename() pour extraire le nom du fichier sans le chemin et ainsi vérifier que le nom du fichier est autorisé avant de réaliser l'inclusion.

Voici un exemple de correction du code PHP vulnérable :

<?php
    $file = basename($_GET['file']);
    $allowed_files = array('page1', 'page2', 'page3'); // Liste des fichiers autorisés
    if (in_array($file, $allowed_files)) {
        include('/var/www/html/' . $file . '.php');
    } else {
        echo "Fichier non autorisé";
    }
?>

CWEs

References

URL :

Retour fiches vulnérabilités