Shikata Ga Nai

Private? There is no such things.

構造化データ形式でのサーバーサイドパラメータ汚染 – JSONインジェクションによる権限昇格

Hello there, ('ω')ノ

Server-side Parameter Pollution(SSPP)は、JSONやXMLのような構造化データフォーマットでも発生する可能性があります。特に、ユーザー入力をサーバーが構造化データとして内部APIに渡す処理で、バリデーションやエンコーディングが適切でないと、インジェクションが成立します。


🎯 目的

サーバー側で構築されるJSON(またはXML)に、ユーザー入力からのインジェクションによって“余分なフィールド”を追加できるかを検証し、権限昇格などの脆弱性が存在するかを確認します。


🧪 攻撃のシナリオ例

通常のフロー:

POST /myaccount
name=peter

→ サーバー内部で以下のようなJSONが生成される:

{
  "name": "peter"
}

攻撃リクエスト:

POST /myaccount
name=peter","access_level":"administrator

→ サーバー側で構造化する処理に適切なエスケープ処理がない場合、次のようなJSONが生成される:

{
  "name": "peter",
  "access_level": "administrator"
}

💥 → インジェクション成功!アクセスレベルが管理者に変更される可能性あり!


🔎 この攻撃が成立する条件

  • サーバーがフォームのキー・値をJSON化して内部APIへ渡している
  • 値にクォート(") がそのまま渡ってしまい、構造の一部として認識される
  • 構文エラーが発生しない限り、サーバーは“追加フィールド”として受け入れてしまう可能性あり

💡 試すべき値の例

入力 意図
name=peter","access_level":"admin フィールド追加
name=test","is_admin":true 真偽値の注入
name=attacker","role":"superuser 役割変更系
name=123","permissions":["read","write","delete"] 配列構造の挿入

🧪 テスト方法

  1. プロフィール変更や情報更新などのPOSTフォームを探す
  2. 通常値で送信し、バックエンドの構造を推測
  3. クォート(", ')、カンマ(,)を含んだ入力に変更
  4. エラーが出るか、挙動が変わるかを観察
  5. 意図的に構造を壊すことで、内部構造が漏れる場合もあり

🔍 レスポンスから読み取るヒント

挙動 意味
エラーなく処理完了 インジェクション成功の可能性あり
JSON構文エラー(syntax error) サーバーが構造化データを生成している証拠
管理者向けUIが表示された アクセスレベルが変更された可能性大

まとめ:JSON/構造化データにおけるSSPPの重要ポイント

チェック項目 解説
ユーザー入力がJSONとして扱われているか? 内部処理でJSONに変換されていることが前提
", ,, {, } を含む値で構造を壊す インジェクションの基本テクニック
フィールド追加に成功すると、本来操作不可の値を制御可能に 権限昇格、設定変更、情報漏洩につながる

このようなSSPPは、パラメータがJSON/XMLなどに自動変換される処理でしばしば見落とされるため、非常に実用的かつ危険な攻撃パターンです。ペネトレーションテストでは必ずチェックしておきたいポイントです。

Best regards, (^^ゞ