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, (^^ゞ