Shikata Ga Nai

Private? There is no such things.

LAB: リミットオーバーラン競合状態の攻略 – Burp Suiteで割引を何度も適用して不正購入

Hello there, ('ω')ノ

🎯 目的

  • 割引コード適用処理に潜む競合状態の脆弱性を発見し悪用する。
  • 20%割引を複数回適用し、本来よりも大幅に安い価格で商品を購入。
  • 所持クレジット内でジャケットを購入すればラボクリア。

🔐 アカウント情報

ユーザー名: wiener
パスワード: peter

🧪 攻撃準備:挙動の把握と予測

  1. 一番安い商品をカートに追加。

  2. 提供された割引コードを適用。

  3. Burp Proxy でキャプチャし、以下のエンドポイントを確認:

    • POST /cart:商品をカートに追加
    • POST /cart/coupon:割引コードを適用
    • GET /cart:カートの中身確認
  4. GET /cart リクエストを Repeater に送り、セッションCookieの有無で動作を確認:

    • Cookieあり:カートの中身が表示される
    • Cookieなし:空のカート
    • → カート情報はサーバー側でセッション単位で管理されていると判明

⏱ 挙動の確認(ベンチマーク)

  1. POST /cart/coupon を Repeater に送信。
  2. 同じリクエストを2回送信:

    • 1回目:割引適用成功
    • 2回目:Coupon already applied エラー

→ ここで「適用済みチェック」と「割引登録処理」の間にレースウィンドウがあると推測可能。


🚀 攻撃実行(競合状態を発生させる)

Burp Suite Professional(2023.9+)

  1. POST /cart/coupon を Repeater に送り、Custom actions パネルを開く。
  2. 「New > From template」→ Trigger race condition を選択し保存。
  3. 作成された「Trigger race condition」横の ▶️ をクリック → 20回の並列リクエスト送信
  4. ブラウザで /cart を確認:

    • 割引が 複数回適用 されていれば成功!

Burp Suite Community Edition(無料版)

  1. POST /cart/coupon を Repeater で新しいタブグループに追加。
  2. 右クリック →「Duplicate tab」×19 → 合計20タブにする。
  3. グループを右クリック →「Send group in parallel」で20並列送信
  4. ブラウザで /cart を確認:

    • 複数回割引が適用されていれば成功!

🧥 本命商品の購入でラボクリア

  1. 適当な商品・割引コードをカートから削除。
  2. Lightweight L33t Leather Jacket をカートに追加。
  3. POST /cart/coupon の並列リクエストを再度送信(20回)。
  4. /cart を更新し、価格を確認:

    • クレジット以下なら購入 → 🎉 ラボクリア!
    • 高ければ割引コードを削除し再実行。

💡 攻略のコツとヒント

テクニック 解説
リクエストは同時送信が鍵 並列実行が成功率を左右する
成功の兆候はレスポンスにあり "Coupon applied" が複数 → 成功の合図
成功しないなら何度もリトライ 割引削除 → 攻撃再実行を繰り返す
シングルパケット攻撃(Proのみ) タイミング制御に最適(内部・外部レイテンシ対策)

🛡 開発側の対策

  • データベース操作をアトミックにする(トランザクション使用)
  • クーポン適用に一意制約(UNIQUE)を追加
  • リクエストの排他制御(ロック)を行う

Best regards, (^^ゞ