Shikata Ga Nai

Private? There is no such things.

RESTパスに対するServer-side Parameter Pollution(SSPP)のテスト – パストラバーサルによる内部APIの乗っ取り

Hello there, ('ω')ノ

RESTful API は、データやリソースをURLパス内に含めて表現するのが一般的です。これにより、URL自体が“パラメータの一部”になるため、パスの構造を操作してサーバー内部APIに影響を与える攻撃が成立することがあります。


🎯 目的

URLパス中のパラメータ(例:ユーザー名など)に対して、パストラバーサル構文(../)をエンコードして注入し、REST APIのルーティングやアクセス制御をバイパスできるかを確認する。


🔍 攻撃対象例

通常のリクエスト:

GET /edit_profile.php?name=peter

→ サーバー内部で以下のAPIに変換されると想定:

GET /api/private/users/peter

🧪 攻撃リクエスト:パス操作を試す

GET /edit_profile.php?name=peter%2f..%2fadmin

📌 %2f = /.. = 上位ディレクトリ → 結果として以下のように構築される可能性:

GET /api/private/users/peter/../admin

💥 サーバーがこのパスを「正規化(normalize)」すれば:

→ /api/private/users/admin

👉 本来アクセスできない管理者アカウントのプロフィールを参照できてしまう!


🔍 挙動からの判定ポイント

観察結果 解釈
admin ユーザーの情報が表示された パス正規化され、攻撃成功!
404 Not Found 不正なパスであるが、処理がされた形跡あり → 追加調査の価値あり
Invalid username のようなエラー サーバー側が名前をパスとして扱っている可能性大
正常に peter の情報が返る パストラバーサルが無視された or エンコードが適用されなかった可能性

🔁 その他試すべきバリエーション

試すパターン 内容
%2e%2e .. の別エンコード形式
peter%2f..%2fadmin%2fprofile 管理者の子リソースを狙う場合
%252e%252e 二重エンコード(WAFバイパス狙い)
%2e%2e/%2e/%2e/ パストラバーサルの変形構文

まとめ:RESTパスでのSSPPテストのポイント

テクニック 解説
%2f..%2f を使ってパスを1階層上に移動 REST APIのアクセス制御をバイパス可能
結果のレスポンスや挙動を詳細に観察 成功・失敗の判定の鍵はレスポンスメッセージにある
パストラバーサル構文を変化させて試行 サーバーの正規化処理によって通る場合がある
フロントからは渡せないリソースにアクセス可能になる 管理者情報、非公開API、設定エンドポイントなど

REST APIでは、「クエリパラメータだけでなくパス自体も攻撃対象になる」ことを意識しておくと、より深いテストが可能になります。特にパスがユーザー制御で変化するようなAPIは、常にこの種の攻撃に注意が必要です。

Best regards, (^^ゞ