Solution de vilerio pour Babel Web

intro web

1 décembre 2023

Cette épreuve consiste à rechercher un flag dans un site web en construction. Or, lorsqu’un site web est en cours de développement, le développeur laisse des commentaires afin de pouvoir se retrouver dans son code et dans le fonctionnement de son site.
Nous allons donc afficher le code source de la page (clic droit puis afficher le code source) pour voir les commentaire html, et on peut remarquer une ligne intriguante :


<html>
	<head>
		<title>Bienvenue à Babel Web!</title>
	</head>
	<body>
		<h1>Bienvenue à Babel Web!</h1>
		La page est en cours de développement, merci de revenir plus tard.
		<!-- <a href="?source=1">source</a> -->
	</body>
</html>
<!-- <a href="?source=1">source</a> -->

Cette ligne un lien hypertexte mis entre commentaire (en html, les commentaires commençent par <!-- et finissent par -->), le nom de ce lien cliquable est “source”, on peut donc imaginer que derrière ce lien se cache le code source du site, mais à part de l’html, que peut-on trouver ?

Un bon réflexe en CTF pour les épreuves web consiste à utiliser une extension comme Wappalyzer qui permet de lister les technologies utilisées par un site, afin de savoir quel méthode utiliser pour récupérer le flag : ici Wappalyzer indique que le site utilise du PHP, donc on peut se douter que la faille repose sur l’utlisation du PHP.

ScreenWappa

Nous allons donc nous rendre sur la page source en question via l’url http://localhost:8000/?source=1, car le lien hypertexte renvoie vers ?source=1 (le href dans la balise <a>).

<?php
    if (isset($_GET['source'])) {
        @show_source(__FILE__);
    }  else if(isset($_GET['code'])) {
        print("<pre>");
        @system($_GET['code']);
        print("<pre>");
    } else {
?>
<html>
    <head>
        <title>Bienvenue à Babel Web!</title>
    </head>
    <body>
        <h1>Bienvenue à Babel Web!</h1>
        La page est en cours de développement, merci de revenir plus tard.
        <!-- <a href="?source=1">source</a> -->
    </body>
</html>
<?php
    }
?>

Nous avons bien affaire ici à du code php, nous n’allons pas cibler la partie chargée de renvoyer le html, que nous connaissons déjà, intéressons-nous au début : ce code php a pour rôle de récupérer la variable “code” passée à l’url, et d’exécuter cette commande sur le serveur hôte ; c’est cette vulnérabilité que nous allons exploiter ici.

Pour envoyer la bonne requête au serveur web, nous allons utiliser l’outil curl, qui sera plus pratique que notre navigateur, curl permet d’envoyer des requêtes http/https aussi bien à des API qu’à des sites web.
Donc si l’on récapitule : il faut envoyer à l’url http://localhost:8000/ la commande ls qui permet de lister les fichiers sous linux via la variable code, ce qui donne ça : http://localhost:8000/?code=ls. La fin de l’url correspond à la variable : ?code= et ls est la valeur de cette variable.

On va maintenant envoyer la requête au serveur avec curl, pour ça c’est très simple, depuis un terminal il faut simplement exécuter (avec curl d’installé) la commande curl suivie de l’url en question entre guillemets :

utilisateur@maSuperMachine % curl "http://localhost:8000/?code=ls"
<pre>flag.php
index.php
<pre>%

Alors ici, deux noms de fichiers sont retournés : flag.php et index.php, il est assez facile de supposer que index.php soit la page du site, et flag.php le fichier contenant le flag, nous allons donc en afficher le contenu, avec la commande cat suivie du nom du fichier flag.php : cat flag.php
Sauf qu’on ne peut pas mettre d’espace dans les url, nous allons donc utiliser la chaine de caractères %20 pour remplacer l’espace dans l’url, ce qui donne l’adresse suivante : http://localhost:8000/?code=cat%20flag.php

utilisateur@maSuperMachine % curl "http://localhost:8000/?code=cat%20flag.php"
<pre><?php
	$flag = "FCSC{xxxxxx}";
<pre>%

Et là bingo, le flag était bien dans le fichier flag.php : vous avez réussi ! (le flag a été modifié ici, à vous de le trouver ;)