はまやんはまやんはまやん

hamayanhamayan's blog

Circus [TJCTF 2020]

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/

f:id:hamayanhamayan:20200527215038p:plain

整ったサイトが出てくる。

調査

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でログインできる。

f:id:hamayanhamayan:20200527215051p:plain