Hello there, ('ω')ノ
🎯 目的
Mass Assignment(マスアサインメント)脆弱性を利用して、Lightweight l33t Leather Jacketを割引価格(100%オフ)で購入し、ラボをクリアする。
🔐 ログイン情報
- ユーザー名: wiener
- パスワード: peter
🧭 手順ガイド
✅ 1. ログイン & 商品をカートに追加
- Burpのブラウザでログイン。
- Leather Jacket の商品ページを開き、カートに追加。
❌ 2. 注文時にクレジット不足になる
- カートページへ移動 → Place order(注文) をクリック
- クレジット不足でエラーが表示されるのを確認
🔍 3. /api/checkout
のGETとPOSTリクエストを比較
- Burpの Proxy > HTTP history を開く
/api/checkout
の GETリクエストとPOSTリクエスト を探す- GETレスポンスに
chosen_discount
パラメータがあるが、POSTにはないことに注目
🛠 4. POSTリクエストに chosen_discount
を追加
- POST /api/checkout を Repeater に送る
- リクエストのJSONに以下を追加:
{ "chosen_discount": { "percentage": 0 }, "chosen_products": [ { "product_id": "1", "quantity": 1 } ] }
- リクエストを送信 → エラーが出なければMass Assignmentの可能性あり!
⚠️ 5. 無効な値でテスト(検証)
"chosen_discount": "x"
- エラー発生 → サーバー側で
chosen_discount
が処理されている証拠
🎯 6. 本命:割引率を100%にして再送信
{ "chosen_discount": { "percentage": 100 }, "chosen_products": [ { "product_id": "1", "quantity": 1 } ] }
- リクエストを送信
- 商品が $0 で購入でき、ラボクリア!
🧠 ポイント解説
ポイント | 内容 |
---|---|
Mass Assignment | chosen_discount は開発側が処理対象にしてしまっているが、ユーザーには公開されていないフィールド |
発見方法 | GETレスポンスで表示されていたが、POSTでは使用されていない点がヒント |
検証方法 | 無効な値を入れて、エラーメッセージから処理の存在を確認 |
悪用方法 | 割引率100%で商品価格を0にして購入 |
✅ まとめ
- Mass Assignmentはレスポンス構造から推測して攻撃できる
- 未公開パラメータでも、内部的に処理されていれば悪用可能
- POSTリクエストに隠しパラメータを追加することで、アプリの挙動を変えられる
このラボはMass Assignmentの典型的な攻撃手法を体験できる、実践的なシナリオです。APIレスポンスは常に「ヒントの宝庫」なので、細部まで観察することが大切です。
Best regards, (^^ゞ