Written by KyleForkBomb
They called me a clown for using PHP, but little did they know I used military-grade SHA256! I'll bet you can't even login to a single account!
Note: brute force is not required
http://circus.tjctf.org/
整ったサイトが出てくる。
調査
/
- トップサイト。特に怪しい所はない
- メニューのSIGN INを開くとログインが出てくる
- Response、404エラーから
- x-powered-by: PHP/7.4.3
- PHP: PHP 7 ChangeLog
- 最新ではなかった。追うのはちょっと大変なので後回し
- Apache/2.4.38 (Debian) Server at circus.tjctf.org Port 80
- x-powered-by: PHP/7.4.3
- ログイン時
- POST
/
- bodyは
username=user&password=pass
- POST
- ソースコードは怪しい所なし
- 手動スキャニング
- /robots.txt -> 404
- /.git/ -> 403
- ん?
- /.git/HEAD -> 200
- あー
git clone
/.git/がある場合はgit cloneができてしまう。
k0st/alpine-dvcs-ripper
を使って、git cloneしよう。
index.phpの中身が見られるので、見てみる。
先頭はこんな感じ。logout.phpというのもあるが、あまり重要じゃない。
<?php require __DIR__ . "/../include/flag.php"; session_start(); $error = ""; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); if (isset($_POST["username"]) && isset($_POST["password"])) { try { $mysqli = new mysqli(NULL, NULL, NULL, "circus"); $stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?"); $stmt->bind_param("s", $_POST["username"]); $stmt->execute(); $res = $stmt->get_result(); if ($res->num_rows === 0) { $error = "Invalid credentials"; } else { $row = $res->fetch_assoc(); if (hash('sha256', $_POST["password"]) == $row["password"]) { $_SESSION["id"] = $row["id"]; $_SESSION["name"] = $row["fname"]; } } } catch (Exception $e) { $error = "Error signing in"; } } ?> ... <?php if (isset($_SESSION["name"])): ?> <h2>Welcome <?=$_SESSION["name"]?><br>Your Flag is <span><?=$flag?></span></h2> <?php else: ?> <h2>TJ Circus<br>for Your <span>Entertainment!</span></h2> <?php endif; ?>
/../include/flag.php
はレポジトリに含まれてないしなーとも思ったが、とりあえずgitのログを見てみる。
最新コミットはoopsとあり、いかにもやっちまった感が出ている。
中を見ると、userデータのバックアップコマンドと結果だった。
大量のユーザーデータが出てくる。
ソースコードをよくよくみてみると、ハッシュ後の比較は==
となっている。
phpの==
は危険とあれほど…ということで、magic hashを考える。
Magic Hash
phpでは'0e????'=='0e????'
がtrueになることを利用する。
流出したユーザーデータを見ると、条件を満たすものがある。
(773,'Andon1956','0e75759761935916943951971647195794671357976597614357959761597165','Rosie','Kelly')
よし。
spaze/hashes: Magic hashes – PHP hash "collisions"
ここから、sha256の時のやつを持ってくる。
Andon1956:34250003024812でログインできる。