Comprendre les vulnérabilités d'inclusion de fichiers dans les applications web

Beginner

Introduction

Bienvenue dans notre cours convivial pour débutants sur les vulnérabilités des applications web, se concentrant spécifiquement sur les vulnérabilités d'inclusion de fichiers (file inclusion vulnerabilities), qui sont parmi les problèmes les plus répandus dans les applications web.

Dans ce module, nous commencerons par disséquer le concept d'« inclusion de fichiers » dans le contexte des applications web. Nous nous appuierons ensuite sur cette base pour élucider ce qui constitue une « vulnérabilité d'inclusion de fichiers ». Enfin, nous aborderons les deux catégories principales de vulnérabilités d'inclusion de fichiers.

Dans la section suivante de ce module, nous approfondirons les « Vulnérabilités d'Inclusion de Fichiers Locaux » (Local File Inclusion Vulnerabilities) et les « Vulnérabilités d'Inclusion de Fichiers Distants » (Remote File Inclusion Vulnerabilities), afin de vous fournir une compréhension complète de ces problèmes de sécurité critiques.

Objectifs d'Apprentissage Clés
  • Comprendre le concept fondamental de l'inclusion de fichiers dans les applications web.
  • Saisir les principes sous-jacents des vulnérabilités d'inclusion de fichiers.
  • Apprendre les deux principaux types de vulnérabilités d'inclusion de fichiers : Locales et Distantes.

Comprendre l'inclusion de fichiers

Plongeons dans le concept d'« inclusion de fichiers » (file inclusion) et ses vulnérabilités potentielles, spécialement conçues pour les débutants.

L'inclusion de fichiers est une pratique courante en programmation, particulièrement dans le contexte de la réutilisation de code. Les développeurs encapsulent souvent des fonctions ou des modules fréquemment utilisés dans des fichiers séparés. Lorsque ces fonctions ou modules sont nécessaires, ils incluent simplement ces fichiers dans leur code, éliminant ainsi le besoin de réécrire le même code de manière répétée.

En PHP, il existe quatre fonctions principales pour l'inclusion de fichiers :

  1. include()
  2. require()
  3. include_once()
  4. require_once()

Voici un bref aperçu de chacune :

  • include() : Cette fonction inclut un fichier lorsqu'elle est invoquée. Si le fichier est introuvable, PHP émet un avertissement (warning), mais le script continue de s'exécuter.
  • require() : Cette fonction inclut un fichier avant que le script ne commence son exécution. Si le fichier est introuvable, PHP émet une erreur fatale (fatal error) et arrête le script.
  • include_once() et require_once() : Ces fonctions fonctionnent de manière similaire à include() et require(), mais elles garantissent que le fichier n'est inclus qu'une seule fois, même si la fonction est appelée plusieurs fois.

Les méthodes d'inclusion de fichiers peuvent être largement classées en deux types :

  1. Inclusion statique (Static inclusion)
  2. Inclusion dynamique (Dynamic inclusion)

La distinction entre ces deux types sera clarifiée par un exemple dans les sections suivantes.

Dans notre cours, nous allons explorer trois fichiers .php situés dans le répertoire /home/labex/project/. Ce sont :

  • lfi_static.php
  • lfi_dynamic.php
  • echo.php

Comprendre ce que fait chaque fichier :

  • lfi_static.php : Ce fichier inclut le fichier echo.php de manière statique. En d'autres termes, le chemin d'accès au fichier echo.php est codé en dur (hard-coded) et ne change pas. Cette méthode est sécurisée et n'expose aucune vulnérabilité.

    <?php
    include("./echo.php");
    ?>
  • lfi_dynamic.php : Ce fichier inclut d'autres fichiers en fonction d'un paramètre 'file' dans l'URL. Si ce paramètre n'est pas fourni, il donne simplement une indication sur la manière de l'utiliser. Cependant, cette méthode peut être risquée si le paramètre est contrôlé par un attaquant.

    <?php
    if (isset($_GET['file'])) {
        include($_GET['file']);
    }
    else{
        echo "You can use the 'file' parameter to include files";
    }
    ?>
  • echo.php : Ce fichier affiche simplement un message de succès lorsqu'il est inclus.

    <?php
    echo 'Great, now you have successfully included the content of echo.php!'
    ?>

Utilisez les commandes suivantes dans le terminal pour préparer l'image pour le test LFI :

cd ~/projects
docker build -t lfi-image .

Une fois la construction de l'image terminée, vous pouvez l'utiliser pour démarrer un conteneur afin de tester la vulnérabilité LFI :

docker run -d --name lfi -p 80:80 lfi-image

Vous pouvez maintenant tester ces fichiers dans votre navigateur. Par exemple, pour accéder au fichier lfi_static.php, vous devriez entrer l'URL suivante :

http://127.0.0.1/LFI/lfi_static.php

Vous verrez que le fichier lfi_static.php inclut avec succès le contenu de echo.php. Rappelez-vous que cette méthode statique d'inclusion de fichiers est sécurisée.

Maintenant, examinons le fichier lfi_dynamic.php. Accédez-y en utilisant cette URL :

http://127.0.0.1/LFI/lfi_dynamic.php

Vous verrez une invite vous demandant d'utiliser le paramètre 'file'. Faisons cela et incluons echo.php :

http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php

Vous verrez que echo.php est inclus avec succès. Cela démontre le fonctionnement de l'inclusion de fichiers. Il est important de se rappeler que bien qu'il s'agisse d'un exemple PHP, les principes s'appliquent à d'autres langages de programmation, même si les fonctions spécifiques utilisées peuvent différer.

Comprendre la vulnérabilité d'inclusion de fichiers

Nous avons récemment appris comment inclure le fichier echo.php en utilisant le paramètre file dans lfi_dynamic.php. Mais une question se pose :

Est-il possible d'inclure d'autres fichiers en utilisant le paramètre file ?

La réponse est un oui retentissant !

Si le développeur web néglige de valider le paramètre file, il peut potentiellement être exploité pour inclure des fichiers sensibles situés sur le serveur.

Voici quelques exemples :

  • Sur un système Linux, vous pourriez être en mesure d'inclure le fichier /etc/passwd.
  • Sur un système Windows, vous pourriez potentiellement inclure le fichier C:\Windows\System32\drivers\etc\hosts.

Illustrons cela avec un exemple. Supposons que nous définissions le paramètre file sur /etc/passwd :

http://127.0.0.1/LFI/lfi_dynamic.php?file=/etc/passwd

Ouvrez l'URL dans le navigateur, vous verrez que nous avons réussi à inclure et à afficher le contenu du fichier /etc/passwd. Cela indique la présence d'une vulnérabilité d'Inclusion de Fichiers Locale (Local File Inclusion - LFI), qui est un problème de sécurité grave.

Rappelez-vous, comprendre ces vulnérabilités est la première étape pour les prévenir. Assurez-vous toujours de valider et d'assainir (sanitize) toutes les entrées utilisateur dans vos applications web.

Types de vulnérabilités d'inclusion de fichiers

Les vulnérabilités d'inclusion de fichiers (file inclusion vulnerabilities), un problème critique en sécurité web, sont généralement divisées en deux types principaux :

  1. Inclusion de Fichiers Locale (LFI - Local File Inclusion) : Ce type de vulnérabilité se produit lorsque des fichiers locaux sur le serveur ciblé sont inclus.

  2. Inclusion de Fichiers à Distance (RFI - Remote File Inclusion) : Ce type de vulnérabilité se produit lorsque des fichiers situés sur un serveur différent et distant sont inclus.

Dans l'exemple que nous avons discuté précédemment, l'inclusion du fichier local /etc/passwd est un cas d'école de vulnérabilité d'Inclusion de Fichiers Locale (LFI). Comprendre la distinction entre ces deux types de vulnérabilités est crucial pour sécuriser efficacement vos applications web.

Résumé

Dans ce laboratoire, vous avez appris la méthode et le processus pour initier une attaque via la fonctionnalité d'inclusion de fichiers. Récapitulons les points importants abordés dans cette section :

  • Qu'est-ce que l'inclusion de fichiers ?
  • Qu'est-ce qu'une vulnérabilité d'inclusion de fichiers ?
  • Quels sont les deux types de vulnérabilités d'inclusion de fichiers ?