Mawa Town

Mawaという人が作る小さな町でMawaTownです。技術と音楽が好き。

Webのログインクラック問題を解く[CTF for Beginners 2018]"[Warmup] Greeting"

f:id:k_mawa:20180613010427p:plain

経緯

この記事を元にCTF復習中
SECCON Beginners CTF 2018 Write-up

手順

1 まず挙動を見る

コードもぺろんと書かれている

<?php

if(isset($_POST['name'])) {
  setcookie("name", $_POST['name'], time()+3600);
  $username = htmlspecialchars($_POST['name'], ENT_QUOTES, "UTF-8");

  // 管理者でログインできる?
  if($username === "admin") {
    $username = "偽管理者";
  }
} elseif(isset($_COOKIE['name'])) {
  $username = htmlspecialchars($_COOKIE['name'], ENT_QUOTES, "UTF-8");
} else {
  $username = "ゲスト";
}

?>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>SECCON Beginners greeting service</title>
  </head>
  <body>
    <h1>こんにちは!<?=$username?>さん!</h1>
    <hr>
    <?php if($username === 'admin'): ?>
      こんにちは管理者さん。
      Flagは、 &quot;<?=$_ENV['SECCON_BEGINNERS_FLAG']?>&quot;です。
    <?php else: ?>
      こんにちは<?=$username?>さん。
      Flagは、管理者である&quot;admin&quot;さんにのみしか表示されません。
    <?php endif; ?>
    <form method="POST">
      <input type="text" placeholder="名前" name="name">
      <button type="submit">名前を変更する</button>
    </form>
    <pre>
    <code>
<?=htmlspecialchars(file_get_contents("./index.php"), ENT_QUOTES, "UTF-8")?>
    </code>
    </pre>
  </body>
</html>

$username == 'admin'ならFlagは、・・・と表示されるはずが、フォームにadminと入れるとPHPによって$username = '偽管理者'と代入されなおされてしまう!うーむ。

$_POST['name']うんたらということはPOSTメソッドのときに動くわけであるから、POSTじゃない方法でクッキーにadminとセットしたままこのサーバーにアクセスできればいいんだ。ということになる。

GETでアクセス

要するに、これは一旦POSTしたあとに再読込すればいいということになる。

こんにちは管理者さん。 Flagは、 "ctf4b{w3lc0m3_TO_ctf4b_w3b_w0rd!!}"です。 

OK!

curlでもできるよ

もちろんカールでもできます^^

$ curl -b name=admin greeting.chall.beginners.seccon.jp 

参考資料によると、下記のようにgrepをかけると、flag部分だけ抽出できてより手っ取り早い!

$ curl -b name=admin greeting.chall.beginners.seccon.jp | grep ctf4b

参考引用元記事

こちらも参考にさせていただきました。
http://zeosutt.hatenablog.com/entry/2018/05/27/140530