Shikata Ga Nai

Private? There is no such things.

LAB: クエリ文字列でのサーバーサイドパラメータ汚染を悪用する

Hello there, ('ω')ノ

🎯 目的

このラボでは、Server-side Parameter Pollution(SSPP) 脆弱性を利用して、管理者アカウントとしてログインし、ユーザー carlos を削除することでクリアします。


🧪 攻撃の手順まとめ


✅ 1. パスワードリセットをトリガー

Burpのブラウザで administrator のパスワードリセットを実行


✅ 2. POST /forgot-password リクエストを Repeater に送信

  • username を administratoradministratorx にしてみて、Invalid username エラーが出ることを確認

✅ 3. SSPPテスト①:URLエンコードした & でパラメータ追加を試みる

username=administrator%26x=y

Parameter is not supported エラーが出る → パラメータが分割されて解釈された証拠!


✅ 4. SSPPテスト②:%23(URLエンコードした #)でクエリ切り捨てを試す

username=administrator%23

Field not specified エラー → 内部で field パラメータが必須?


✅ 5. field パラメータを注入し、%23 で打ち切る

username=administrator%26field=x%23

Invalid field エラー → field パラメータが有効だが値が不正な場合の反応!


✅ 6. Burp Intruderで field の値を総当たり(ブルートフォース)

username=administrator%26field=§x§%23
  • Intruder Payload List → Server-side variable names を使用
  • emailusername の2つが 200 OK を返す → 有効なフィールド!

✅ 7. field=email を指定して送信

username=administrator%26field=email%23

→ 正常なレスポンス → 有効なフィールドであることが確定!


✅ 8. JavaScriptファイルから reset_token を発見

  • /static/js/forgotPassword.js を確認
  • パスワードリセットに使用される reset_token が存在する

✅ 9. field=reset_token を使ってリセットトークンを入手

username=administrator%26field=reset_token%23

→ パスワードリセットトークンがレスポンスに表示される!


✅ 10. トークンを使ってパスワードリセット

  • Burpのブラウザで以下のようなURLにアクセス:
/forgot-password?reset_token=<取得したトークン>
  • 新しいパスワードを設定(任意)

✅ 11. 新しいパスワードでログイン

  • ユーザー:administrator
  • パスワード:先ほど設定したもの

✅ 12. Adminページにアクセスして carlos を削除

→ ラボクリア!


まとめ:この攻撃のポイント

攻撃手法 解説
%26(エンコードした & パラメータを分割してサーバー内部APIに追加する
%23(エンコードした # クエリを途中で切り捨てて制御フローを操作する
Intruderで field の値を総当たり 内部APIが受け付けるフィールドを発見
パラメータ注入で reset_token を取得 管理者アカウントの乗っ取りに成功!

このラボは、SSPPのクエリ文字列における非常にリアルで強力な攻撃手法を学べる内容になっています。複数のサーバー処理とエラーメッセージの観察から脆弱性を丁寧に掘り下げていくのが成功の鍵です。

Best regards, (^^ゞ