Hello there, ('ω')ノ
脆弱性報告レポート
(PortSwigger Web Security Academy – Lab: Flawed enforcement of business rules)
概要(Summary) — 140 字以内
クーポン適用 API が 同一コードの重複直前適用のみを拒否 しており、NEWCUST5
と SIGNUP30
を交互に送信すれば 割引額が無限に蓄積。
その結果、Lightweight l33t leather jacket を残高以下の価格で購入できる。
再現手順(Steps) — 3〜5 行
- https://lab-url/ に wiener:peter でログイン。
- トップページで NEWCUST5 を確認し、ニュースレター登録 → メールリンクから SIGNUP30 を取得。
- 皮ジャンをカートへ追加し、チェックアウト画面へ移動。
- フォームで
NEWCUST5
→SIGNUP30
→NEWCUST5
… の順に交互で 10 回以上適用。 - 合計額がストアクレジット未満になったら注文確定(30 秒以内に再現可)。
結果(Result)
項目 | 値 |
---|---|
初期合計 | \$1 337.00 |
クーポン交互適用後 | \$-15.00(負値) |
決済時 | 合計を \$0 として処理、注文完了表示 |
主要リクエスト差分(交互適用)
POST /cart/coupon HTTP/1.1 Host: lab-url Cookie: session=… Content-Type: application/x-www-form-urlencoded - coupon=NEWCUST5 + coupon=SIGNUP30
連続で同じ値を送ると
"Coupon already applied"
を返すが、 異なるコードを挟むと サーバ側の “適用済みフラグ” がリセットされる。
期待挙動(Expected) — 1 行
各クーポンは一注文につき 1 回のみ加算可能であり、交互入力でも割引が累積しない(超過時は 400 又は 403)。
影響度(Impact)
- 無制限値引き → 直接的な売上損失、価格改ざん
- ビジネスロジック破綻により 財務レポートの信頼性低下
- OWASP A07:2021 識別と認証の失敗/Business Logic Flaw
- CWE-840 不適切なビジネスルール実装
修正提案(Optional)
- 注文 ID + クーポン ID でユニーク制約を設け、二重適用をサーバ側で拒否。
- 割引計算を 累積差額方式 ではなく「対象商品の %OFF 計算後で打ち切り」。
- 適用済みクーポンを セッションではなく DB トランザクション内 で管理。
- 単体テストに「交互適用・大量適用」ケースを追加し CI で自動検出。
PoC 添付物
- Screenshot 1:交互適用後、合計 -\$15 表示(赤枠)。
- Screenshot 2:注文完了画面。
- PoC-requests.txt / PoC-diff.txt:交互適用 3 往復分の HTTP ログと差分。
Retest プラン
修正通知後、NEWCUST5 → SIGNUP30 → NEWCUST5
の 3 連続送信で
「2 つ目以降が 400/403」または合計値が変動しないことを確認。未修正時は新スクショ添付でリオープンします。
7 日後まで進捗をお待ちしております。よろしくお願いいたします。
Best regards, (^^ゞ