Shikata Ga Nai

Private? There is no such things.

SSRFのホワイトリスト型フィルタを回避する方法

Hello there, ('ω')ノ

一部のアプリケーションでは、SSRFを防ぐためにホワイトリストベースの入力フィルタ を実装しています。
この場合、特定のドメインやURLパターンのみ許可 することで、不正なリクエストをブロックしようとします。

しかし、URLのパース処理に不備があると、ホワイトリストを回避してSSRF攻撃を実行できる可能性があります。


1. ホワイトリストフィルタの回避方法

@ を利用して異なるホストにリダイレクト

通常、URLには認証情報を含めることができます。
この認証情報の後に @ を入れると、一部のシステムは「前半部分」をホスト名として認識し、「後半部分」に実際に接続する ことがあります。

▶ 回避例:

https://whitelisted.com@evil.com/admin

フィルタは whitelisted.com を許可しているが、実際のリクエストは evil.com/admin に送信される!


# を使ってホストを隠す

#(URLフラグメント)は、通常 ブラウザ内の処理にのみ影響を与える ため、サーバーには送信されません。
しかし、一部のサーバーは # 以降の部分を誤ってホスト名の一部として処理することがあります。

▶ 回避例:

https://evil.com#whitelisted.com/admin

一部のフィルタは whitelisted.com を含んでいるため許可するが、実際のリクエストは evil.com/admin に送られる!


③ サブドメインを利用する

ホワイトリストが whitelisted.com を許可している場合、攻撃者がサブドメインを設定し、それを許可されたドメインに見せかける ことで回避できます。

▶ 回避例:

https://whitelisted.com.evil.com/admin

フィルタは whitelisted.com を含んでいるため許可するが、実際には evil.com にリクエストが送信される!


④ URLエンコーディングを利用する

一部のフィルタは、URLのプレーンテキスト部分のみチェックしているため、URLエンコーディングを利用すると回避できることがあります。

▶ 回避例:

https://whitelisted.com%2Fevil.com/admin

エンコードされた / をフィルタが正しく処理できず、evil.com/admin にリクエストが送信される!

💡 さらに、二重エンコーディング(%252F)を使うと、さらに多くのフィルタを回避できる可能性がある!


⑤ DNSの解決順序を利用する

一部のサーバーでは、ホワイトリストのチェックと実際のリクエストの処理で異なるDNS解決順序を使用することがあります。
この場合、一時的にホワイトリストドメインを攻撃者のIPに解決させることで、SSRFを実行可能 です。

▶ 回避例(攻撃者がDNSをコントロールできる場合):

https://whitelisted.com

攻撃者が whitelisted.com を自分のサーバーに向けると、内部リクエストが攻撃者のサーバーに送信される!


2. 複数のテクニックを組み合わせる

上記の回避手法は 単体でも有効 ですが、複数の手法を組み合わせることで、より強力なバイパスが可能 になります。

▶ 例:@ と # を組み合わせる

https://whitelisted.com@evil.com#whitelisted.com/admin

フィルタは whitelisted.com を許可しているが、実際のリクエストは evil.com/admin に送信される!

▶ 例:サブドメインとエンコーディングを組み合わせる

https://whitelisted.com%2Fevil.com/admin

エンコードとサブドメイン回避を組み合わせて、フィルタをすり抜ける!


3. まとめ

ホワイトリスト回避手法 説明
@ を利用 https://whitelisted.com@evil.com/admin
# を利用 https://evil.com#whitelisted.com/admin
サブドメイン https://whitelisted.com.evil.com/admin
URLエンコーディング https://whitelisted.com%2Fevil.com/admin
DNSの解決順序 https://whitelisted.com(攻撃者がDNSを操作)

🚨 ホワイトリスト型のフィルタも、URLのパース処理に不備があると簡単に回避される!
🚀 正しい防御策として、厳格なホワイトリスト管理とURLの正規化を実装することが重要!

Best regards, (^^ゞ