{"id":2563,"date":"2019-04-14T12:29:27","date_gmt":"2019-04-14T10:29:27","guid":{"rendered":"https:\/\/www.asafety.fr\/?p=2563"},"modified":"2019-04-14T16:47:12","modified_gmt":"2019-04-14T14:47:12","slug":"breizhctf-2k19-write-up-web-octogoneboobakaarris","status":"publish","type":"post","link":"https:\/\/www.asafety.fr\/en\/events\/breizhctf-2k19-write-up-web-octogoneboobakaarris\/","title":{"rendered":"[BreizhCTF 2k19] Write-Up \u2013 Web : OctogoneBoobaKaarris"},"content":{"rendered":"\n<p style=\"text-align:center\"><strong>Pr\u00e9sentation d\u2019un write-up de r\u00e9solution du challenge \u00ab Web \u2013 OctogoneBoobaKaarris \u00bb de la BreizhCTF 2019.<\/strong><\/p>\n\n\n\n<p>Durant la nuit du 12 au 13\/04\/2018 se d\u00e9roulait la <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/www.breizhctf.com\/\" target=\"_blank\">BreizhCTF 2019<\/a><\/strong>&nbsp;sous forme d\u2019un&nbsp;<strong>CTF Jeopardy<\/strong>. Ayant eu l\u2019occasion et le temps d\u2019y participer avec quelques coll\u00e8gues et amis, voici un <em>write-up<\/em> de r\u00e9solution d\u2019un des challenges.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Cat\u00e9gorie :&nbsp;<strong>Web<\/strong><\/li><li>Nom :&nbsp;<strong>OctogoneBoobaKaarris<\/strong><\/li><li>Description :&nbsp;<em>N\/A<\/em><\/li><li>URL : http:\/\/ctf.bzh:20006 \/ http:\/\/10.50.254.254:20006<\/li><li>Points : 75<\/li><\/ul>\n\n\n\n<p><em>tl;dr; : Analyser un code source PHP pour satisfaire toutes les conditions (variables GET, POST, typage, valeurs) afin d\u2019afficher le flag.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/01.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"606\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/01-1024x606.jpg\" alt=\"\" class=\"wp-image-2567\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/01-1024x606.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/01-300x177.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/01-768x454.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/01.jpg 1229w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>L\u2019URL du challenge r\u00e9v\u00e8le un fichier PHP interpr\u00e9t\u00e9, dont le code source est directement affich\u00e9 (highlight_file()) :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/04.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"418\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/04-1024x418.jpg\" alt=\"\" class=\"wp-image-2570\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/04-1024x418.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/04-300x122.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/04-768x313.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/04.jpg 1476w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Aper\u00e7u du challenge et de son code source<br><\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n  highlight_file(__FILE__);\n  error_reporting(0);\n  if($_REQUEST){\n      foreach ($_REQUEST as $key => $value) {\n          if(preg_match('\/[a-zA-Z]\/i', $value))   die('&lt;center>&lt;b>booba vs kaaris... #tristesse&lt;\/b>&lt;\/center>');\n      }\n  }\n  if($_SERVER){\n      if(preg_match('\/octogone|flag|sans_regles\/i', $_SERVER['QUERY_STRING']))  die('&lt;center>&lt;b>booba vs kaaris... #tristesse&lt;\/b>&lt;\/center>');\n  }\n  if(isset($_GET['octogone'])){\n      if(!(substr($_GET['octogone'], 32) === md5($_GET['octogone']))){\n          die('&lt;center>&lt;b>booba vs kaaris... #tristesse&lt;\/b>&lt;\/center>');\n      }else{\n          if(preg_match('\/viens_pas_a_12_cette_fois$\/', $_GET['sans_regles']) &amp;&amp; $_GET['sans_regles'] !== 'Le dopage sera interdit bien evidemment et viens pas a 12 cette fois'){\n              $getflag = file_get_contents($_GET['flag']);\n          }\n          if(isset($getflag) &amp;&amp; $getflag === '#jaiMalAMaFrance'){\n              include 'flag.php';\n              echo $flag;\n          }else die('&lt;center>&lt;b>booba vs kaaris... #tristesse&lt;\/b>&lt;\/center>');\n      }\n  }\n?><\/code><\/pre>\n\n\n\n<p> A la lecture de ce code source, on voit clairement qu\u2019il nous faut satisfaire l&#8217;ensemble des conditions pour que le fichier \u00ab flag.php \u00bb soit inclus et que le flag soit affich\u00e9 : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>          if(isset($getflag) &amp;&amp; $getflag === '#jaiMalAMaFrance'){\n              include 'flag.php';\n              echo $flag;\n          }else die('&lt;center>&lt;b>booba vs kaaris... #tristesse&lt;\/b>&lt;\/center>');<\/code><\/pre>\n\n\n\n<p>Pour faciliter l\u2019avancement de r\u00e9solution de ce challenge, et notamment la validation de chaque condition, dupliquons le code source visible dans un fichier \u00ab octogone.php \u00bb dans notre Apache\/XAMP local.<\/p>\n\n\n\n<p>Num\u00e9rotons les erreurs (booba vs kaaris\u2026 #tristesse), ajoutons quelques \u00ab echo \u00bb et r\u00e9activons les erreurs relatives \u00e0 l&#8217;ex\u00e9cution de ce code pour commencer :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/06-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"461\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/06-1-1024x461.jpg\" alt=\"\" class=\"wp-image-2576\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/06-1-1024x461.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/06-1-300x135.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/06-1-768x346.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/06-1.jpg 1444w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>On remarque qu&#8217;en premier lieu, toutes les variables &#8220;$_REQUEST&#8221; (donc tous les $_GET et $_POST) sont contr\u00f4l\u00e9s dans une boucle afin de v\u00e9rifier qu&#8217;aucun caract\u00e8re alpha (lower\/upper) ne se trouve dans leurs valeurs :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  if($_REQUEST){\n      foreach ($_REQUEST as $key => $value) {\n          if(preg_match('\/[a-zA-Z]\/i', $value))   die('&lt;center>&lt;b>1 booba vs kaaris... #tristesse&lt;\/b>&lt;\/center>');\n      }\n  }<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/07.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"375\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/07-1024x375.jpg\" alt=\"\" class=\"wp-image-2577\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/07-1024x375.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/07-300x110.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/07-768x281.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/07.jpg 1918w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Nous sommes donc contraints de faire figurer que des valeurs autres que lower-alpha \/ upper-alpha pour passer cette condition et ne pas d\u00e9clencher le premier &#8220;die()&#8221;.<\/p>\n\n\n\n<p>La condition suivante s&#8217;assure que les cha\u00eenes &#8220;octogone&#8221;, &#8220;flag&#8221; ou &#8220;sans_regles&#8221; ne figurent pas parmi les param\u00e8tres GET via la variable &#8220;$_SERVER[&#8216;QUERY_STRING&#8217;]&#8221;.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/08.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"622\" height=\"127\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/08.jpg\" alt=\"\" class=\"wp-image-2578\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/08.jpg 622w, https:\/\/www.asafety.fr\/wp-content\/uploads\/08-300x61.jpg 300w\" sizes=\"auto, (max-width: 622px) 100vw, 622px\" \/><\/a><\/figure>\n\n\n\n<p>Mais par la suite, le script n\u00e9cessite la variable &#8220;$_GET[&#8216;octogone&#8217;]&#8221;&#8230; \u00c7a semble contradictoire, non? <\/p>\n\n\n\n<p>Affichons dans le script les valeurs de $_SERVER[&#8216;QUERY_STRING&#8217;], $_GET[&#8220;octogone&#8221;] et observons :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/09.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"513\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/09-1024x513.jpg\" alt=\"\" class=\"wp-image-2579\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/09-1024x513.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/09-300x150.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/09-768x385.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/09.jpg 1476w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption> <br>$_SERVER[&#8216;QUERY_STRING&#8217;] preg_match<\/figcaption><\/figure>\n\n\n\n<p>La seconde condition d\u00e9tecte en effet l&#8217;utilisation du mot &#8220;octogone&#8221; en param\u00e8tre GET, pourtant nous avons besoin de ce nom de variable par la suite. Le second &#8220;die()&#8221; est donc bloquant.<\/p>\n\n\n\n<p>T\u00e2chons de contourner cette analyse de $_SERVER[&#8216;QUERY_STRING&#8217;] en URL-encodant un caract\u00e8re du nom de la variable GET :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/10.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"486\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/10-1024x486.jpg\" alt=\"\" class=\"wp-image-2580\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/10-1024x486.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/10-300x142.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/10-768x364.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/10.jpg 1560w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Bypass  <br>$_SERVER[&#8216;QUERY_STRING&#8217;] analysis<\/figcaption><\/figure>\n\n\n\n<p>Parfait ! En URL-encodant un des caract\u00e8res du nom de la variable GET &#8220;octogone&#8221;, on contourne le test r\u00e9alis\u00e9 sur $_SERVER[&#8216;QUERY_STRING&#8217;], et la variable $_GET[&#8220;octogone&#8221;] existe bel et bien.<\/p>\n\n\n\n<p>En effet, si l&#8217;on compare pour les URLs suivantes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/127.0.0.1\/breizhctf\/octogone.php?octogone=1337\n$_SERVER['QUERY_STRING'] === \"octogone=1337\"\n$_GET[\"octogone\"] === \"1337\"\n\nhttp:\/\/127.0.0.1\/breizhctf\/octogone.php?octo%67one=1337\n$_SERVER['QUERY_STRING'] === \"octo%67one=1337\"\n$_GET[\"octogone\"] === \"1337\"<\/code><\/pre>\n\n\n\n<p>La variable $_SERVER[&#8216;QUERY_STRING&#8217;] n&#8217;est pas &#8220;url_decode()&#8221; automatiquement contrairement aux variables $_GET, ce que la documentation confirme :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/11.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"870\" height=\"937\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/11.jpg\" alt=\"\" class=\"wp-image-2581\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/11.jpg 870w, https:\/\/www.asafety.fr\/wp-content\/uploads\/11-279x300.jpg 279w, https:\/\/www.asafety.fr\/wp-content\/uploads\/11-768x827.jpg 768w\" sizes=\"auto, (max-width: 870px) 100vw, 870px\" \/><\/a><\/figure>\n\n\n\n<p>La condition suivante, maintenant que la variable $_GET[&#8220;octogone&#8221;] existe,  v\u00e9rifie que le substr() \u00e0 partir du 32\u00e8me caract\u00e8re de cette m\u00eame variable, est strictement \u00e9gal au md5() global de la valeur de la variable elle-m\u00eame (!?).<\/p>\n\n\n\n<p>Brisons cette condition en trans-typant en tant que tableau la variable $_GET[&#8220;octogone&#8221;] :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/127.0.0.1\/breizhctf\/octogone.php?octo%67one[]=1337<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/12.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"655\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/12-1024x655.jpg\" alt=\"\" class=\"wp-image-2584\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/12-1024x655.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/12-300x192.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/12-768x491.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/12.jpg 1552w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Transtypage de la variable GET pour contourner le substr() et md5()<\/figcaption><\/figure>\n\n\n\n<p>En ayant r\u00e9activ\u00e9 les erreurs (erreur_reporting(0) comment\u00e9), PHP devient tout de suite plus verbeux, mais ce ne sont que des &#8220;Warning&#8221;, donc la condition est pass\u00e9e ! Le dernier &#8220;die()&#8221; est d\u00e9clench\u00e9.<\/p>\n\n\n\n<p style=\"text-align:left\">Condition suivante, la valeur de la variable $_GET[&#8220;sans_regles&#8221;] doit se terminer par &#8220;<em>viens_pas_a_12_cette_fois<\/em>&#8221; sans \u00eatre strictement \u00e9gale \u00e0 &#8220;<em>Le dopage sera interdit bien evidemment et viens pas a 12 cette fois<\/em>&#8220;.<\/p>\n\n\n\n<p>A\u00efe, cette condition risque de nous donner du fil \u00e0 retordre car &#8220;<em>viens_pas_a_12_cette_fois<\/em>&#8221; est compos\u00e9 de caract\u00e8re alpha, ce qui rentre en conflit avec la toute premi\u00e8re condition et le premier die()&#8230;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/13.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"514\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/13-1024x514.jpg\" alt=\"\" class=\"wp-image-2586\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/13-1024x514.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/13-300x151.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/13-768x385.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/13.jpg 1473w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Condition sans_regles et caract\u00e8re alpha<\/figcaption><\/figure>\n\n\n\n<p>Pour cette \u00e9tape, de nombreuses tentatives infructueuses d&#8217;encodage dans tous les sens de la valeur &#8220;<em>viens_pas_a_12_cette_fois<\/em>&#8221; ont \u00e9t\u00e9 faites, en vain&#8230;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>URL-encode<\/li><li>Double-URL-encode<\/li><li>Octal-Encode<\/li><li>Long Unicode<\/li><li>Etc.<\/li><\/ul>\n\n\n\n<p>Aucun de ces encodages ne permettait de contourner la premi\u00e8re v\u00e9rification-condition sur l&#8217;expression r\u00e9guli\u00e8re &#8220;\/[a-zA-Z]\/i&#8221;. M\u00eame l&#8217;URL-encodage (donc en hexad\u00e9cimal) contenait des caract\u00e8res A-F :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/127.0.0.1\/breizhctf\/octogone.php?octo%67one[]=1337&amp;sans_%72egles=%76%69%65%6e%73%5f%70%61%73%5f%61%5f%31%32%5f%63%65%74%74%65%5f%66%6f%69%73<\/code><\/pre>\n\n\n\n<p>Mais, depuis tout \u00e0 l&#8217;heure, nous ne jouons qu&#8217;avec les param\u00e8tres GET ! Alors que ce premier contr\u00f4le est r\u00e9alis\u00e9 sur $_REQUEST !<\/p>\n\n\n\n<p>$_REQUEST regroupe \u00e0 la fois les param\u00e8tres $_GET et $_POST. Que se passe t&#8217;il si un m\u00eame nom de variable est utilis\u00e9 \u00e0 la fois en GET et en POST ? Lequel prend le dessus ? Un petit PoC s&#8217;impose :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/14.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"695\" height=\"603\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/14.jpg\" alt=\"\" class=\"wp-image-2587\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/14.jpg 695w, https:\/\/www.asafety.fr\/wp-content\/uploads\/14-300x260.jpg 300w\" sizes=\"auto, (max-width: 695px) 100vw, 695px\" \/><\/a><figcaption>GET \/ POST \/ REQUEST priority<\/figcaption><\/figure>\n\n\n\n<p><strong>Jackpot ! Si une m\u00eame variable en GET et en POST est d\u00e9clar\u00e9e (avec une valeur diff\u00e9rente), $_REQUEST privil\u00e9gie la valeur POST !<\/strong><\/p>\n\n\n\n<p>On est donc \u00e0 pr\u00e9sent capable de contourner la condition :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/15.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"718\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/15-1024x718.jpg\" alt=\"\" class=\"wp-image-2588\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/15-1024x718.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/15-300x210.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/15-768x538.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/15.jpg 1448w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Bypass sans_regles condition<br><\/figcaption><\/figure>\n\n\n\n<p>Derni\u00e8re \u00e9tape, maintenant que cette ultime condition est contourn\u00e9e, il nous faut valuer la variable <strong>$getflag<\/strong> avec la cha\u00eene &#8220;<strong>#jaiMalAMaFrance<\/strong>&#8220;.<\/p>\n\n\n\n<p>Pour valuer cette valeur, un &#8220;file_get_contents()&#8221; est r\u00e9alis\u00e9 sur la valeur de $_GET[&#8220;flag&#8221;]. <strong>SSRF <\/strong>?<\/p>\n\n\n\n<p>Plusieurs tentatives de SSRF en passant l&#8217;URL d&#8217;un serveur tiers (http:\/\/attacker.com\/flag, contenant juste &#8220;#jaiMalAMaFrance&#8221;) n&#8217;ont rien donn\u00e9.<\/p>\n\n\n\n<p>La piste du &#8220;php:\/\/input&#8221; n&#8217;\u00e9tait pas exploitable, car &#8220;php:\/\/input&#8221; r\u00e9cup\u00e8re son &#8220;input&#8221; depuis les donn\u00e9es POST, or nous en avons d\u00e9j\u00e0 d\u00e9fini, donc \u00e7a ne pourra par \u00eatre strictement \u00e9gale \u00e0 &#8220;#jaiMalAMaFrance&#8221;.<\/p>\n\n\n\n<p>Il reste le mode brute\/raw, via le wrapper <strong>data:\/\/<\/strong>, testons :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/127.0.0.1\/breizhctf\/octogone.php?octo%67one[]=1337&amp;sans_%72egles=viens_pas_a_12_cette_fois&amp;fl%61g=data:text\/plain,%23jaiMalAMaFrance\n\nDonn\u00e9es POST : \nocto%67one=1337&amp;sans_%72egles=1337&amp;fl%61g=1337<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/16.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"736\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/16-1024x736.jpg\" alt=\"\" class=\"wp-image-2589\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/16-1024x736.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/16-300x216.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/16-768x552.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/16.jpg 1404w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Bypass all condition in local<\/figcaption><\/figure>\n\n\n\n<p>Parfait ! Il ne reste plus qu&#8217;\u00e0 rejouer le tout sur le challenge, soit la requ\u00eate finale :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/index.php?oct%6fgone[]=1337&amp;sans_%72egles=viens_pas_a_12_cette_fois&amp;fl%61g=data:text\/plain,%23jaiMalAMaFrance HTTP\/1.1\nHost: 10.50.254.254:20006\nUser-Agent: Mozilla\/5.0 (Windows NT 6.3; rv:36.0) Gecko\/20100101 Firefox\/36.04\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate\nContent-Type: application\/x-www-form-urlencoded\nContent-Length: 46\nConnection: close\nUpgrade-Insecure-Requests: 1\n\nsans_%72egles=1337&amp;fl%61g=1337&amp;oct%6fgone=1337<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/02.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"510\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/02-1024x510.jpg\" alt=\"\" class=\"wp-image-2590\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/02-1024x510.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/02-300x150.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/02-768x383.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/02.jpg 1505w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/05.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"485\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/05-1024x485.jpg\" alt=\"\" class=\"wp-image-2591\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/05-1024x485.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/05-300x142.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/05-768x364.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/05.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p><strong>Flag :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">BREIZHCTF{un_octogone_sans_arbitre_sans_r\u00e8gles\u2026#jaimalamafrance}<\/pre>\n\n\n\n<p>Ce challenge nous a bien occup\u00e9 une bonne partie de la nuit, surtout qu&#8217;\u00e0 10 minutes de la fin nous n&#8217;\u00e9tions que la seconde \u00e9quipe \u00e0 le r\u00e9ussir :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/03.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"606\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/03-1024x606.jpg\" alt=\"\" class=\"wp-image-2595\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/03-1024x606.jpg 1024w, https:\/\/www.asafety.fr\/wp-content\/uploads\/03-300x178.jpg 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/03-768x455.jpg 768w, https:\/\/www.asafety.fr\/wp-content\/uploads\/03.jpg 1203w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Chapeau \u00e0 Estelle, Martin, et Brian (Samy) pour celui-ci !<\/p>\n\n\n\n<p>Merci \u00e0 toute l\u2019\u00e9quipe de la BreizhCTF pour l\u2019organisation et la qualit\u00e9 des challenges !<\/p>\n\n\n\n<p>Salutations \u00e0 toute l\u2019\u00e9quipe, on remet \u00e7a quand vous voulez&nbsp;&nbsp;\/\/ Gr3etZ<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9sentation d\u2019un write-up de r\u00e9solution du challenge \u00ab Web \u2013 OctogoneBoobaKaarris \u00bb de la BreizhCTF 2019. Durant la nuit du [&hellip;]<\/p>\n","protected":false},"author":1337,"featured_media":2593,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[533,524,523],"tags":[508,46,17,47,536,494],"class_list":["post-2563","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-breizhctf","category-ctf","category-events","tag-challenge","tag-get","tag-php","tag-post","tag-request","tag-web"],"_links":{"self":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/2563","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/users\/1337"}],"replies":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/comments?post=2563"}],"version-history":[{"count":18,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/2563\/revisions"}],"predecessor-version":[{"id":2600,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/2563\/revisions\/2600"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/media\/2593"}],"wp:attachment":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/media?parent=2563"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/categories?post=2563"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/tags?post=2563"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}