Shikata Ga Nai

Private? There is no such things.

サーバーサイドパラメータ汚染(Server-side Parameter Pollution)– 内部APIを乗っ取る隠れた脆弱性

Hello there, ('ω')ノ

💡 どうしてSSPPが発生するのか?

アプリケーションが外部ユーザーからのリクエストを受け取り、その一部をそのまま内部APIリクエストのパラメータとして埋め込んでいるケースがあります。

例: 通常のフロー

  1. ユーザーが以下のURLで検索を行う:
GET /search?query=laptop
  1. サーバー側で内部APIにリクエストを組み立てて送る:
GET /internal/search?q=laptop&type=public

🚨 SSPP攻撃の例

攻撃者が以下のようなリクエストを送信:

GET /search?query=laptop&type=private

アプリケーションがこのtype=privateを適切に処理せず、内部APIにそのまま送ると:

GET /internal/search?q=laptop&type=private&type=public

💥 結果:type=privatetype=public より優先され、非公開データが返ってくる可能性


🔍 テスト対象になる入力ポイント

入力箇所
クエリパラメータ ?id=1&type=admin
フォームフィールド <input name="role" value="user">
ヘッダー X-User-Role: admin
URLパス /profile/admin?id=123

🧪 SSPPのテスト方法

1. パラメータの重複挿入を試す

  • ?type=public&type=private
  • ?user=123&user=456
  • フォーム内で同じ名前のフィールドを2つ送る

2. エンコーディングを使ってバイパスを試す

  • type%3dadmin%3d=のURLエンコード)
  • type%3dadmin&type=guest
  • type=admin%26debug=true&のURLエンコード)

3. ヘッダーやCookieにも注入を試す

  • X-Internal-User: admin
  • Cookie: user_id=1; is_admin=true

🧠 SSPPとよくある混同に注意

用語 内容
Server-side Parameter Pollution 内部APIに渡す際のサーバー側でのパラメータ注入
HTTP Parameter Pollution 同じパラメータを複数指定してWAFをバイパスする手法
Server-side Prototype Pollution JavaScriptオブジェクトの__proto__を汚染する別の脆弱性

💡 このトピックでは SSPP = サーバー内でのパラメータ注入 のみに絞って解説します。


まとめ:SSPP対策と実践ポイント

やること 内容
ユーザー入力をそのまま内部APIに渡さない 必ずサニタイズ・エンコード処理を行う
重複パラメータの優先順位を明確にする 最初の値だけを採用するなどのルールを明示
Burp Intruderでパラメータ汚染テストを実行 同名パラメータやエンコード値を大量に試す
内部APIの挙動を観察 エラーやデータ漏洩が起こっていないかを注意深く確認

SSPPは、内部処理の見落としから発生する脆弱性です。ユーザー入力がどのように使われているかを深く理解し、表面的には見えない「裏側の処理」にこそ注目することが、発見の鍵です。

Best regards, (^^ゞ