L'application PHP de rh.helion-mutuelle.example inclut des pages via un paramètre non filtré :
include($_GET['page'] . ".php");
Deux protections naïves sont en place côté serveur : un suffixe .php est ajouté au nom de fichier, et les séquences ../ sont supprimées (str_replace).
Un auditeur a capturé une session de test (fichier ci-dessous) montrant plusieurs tentatives. À vous de comprendre lesquelles échouent, pourquoi, et comment la dernière exfiltre le secret. Le flag est la constante AUDIT_FLAG du code source à reconstituer.
Astuce historique : l'octet nul%00ne neutralisait le suffixe.phpque sur un PHP ancien (< 5.3.4). Sur un PHP récent, les chemins contenant un octet nul sont refusés : il faut passer par un wrapper (php://filter) ou viser un fichier qui se termine déjà par.php.
Local File Inclusion (LFI)
Le *Local File Inclusion* permet de lire (voire d'exécuter) des fichiers arbitraires quand une entrée utilisateur atteint include/require. Les wrappers comme php://filter servent à exfiltrer du code source, et une chaîne de filtres peut l'encoder plusieurs fois. Parades : ne jamais inclure un chemin construit depuis l'utilisateur ; utiliser une liste blanche de pages autorisées ; désactiver allow_url_include ; filtrer réellement (un simple str_replace('../') se contourne avec ....//) ; stocker les secrets hors de l'arborescence web et via des variables d'environnement.