Shikata Ga Nai

Private? There is no such things.

LAB: Mass Assignment脆弱性を悪用して無料で商品を購入する

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/checkoutGETリクエストとPOSTリクエスト を探す
  • GETレスポンスに chosen_discount パラメータがあるが、POSTにはないことに注目

🛠 4. POSTリクエストに chosen_discount を追加

  • POST /api/checkoutRepeater に送る
  • リクエストの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, (^^ゞ