Shikata Ga Nai

Private? There is no such things.

Lab: Flawed enforcement of business rulesの脆弱性報告レポート

Hello there, ('ω')ノ

脆弱性報告レポート

(PortSwigger Web Security Academy – Lab: Flawed enforcement of business rules


概要(Summary) — 140 字以内

クーポン適用 API が 同一コードの重複直前適用のみを拒否 しており、NEWCUST5SIGNUP30 を交互に送信すれば 割引額が無限に蓄積。 その結果、Lightweight l33t leather jacket を残高以下の価格で購入できる。


再現手順(Steps) — 3〜5 行

  1. https://lab-url/wiener:peter でログイン。
  2. トップページで NEWCUST5 を確認し、ニュースレター登録 → メールリンクから SIGNUP30 を取得。
  3. 皮ジャンをカートへ追加し、チェックアウト画面へ移動。
  4. フォームで NEWCUST5SIGNUP30NEWCUST5 … の順に交互で 10 回以上適用。
  5. 合計額がストアクレジット未満になったら注文確定(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)

  1. 注文 ID + クーポン ID でユニーク制約を設け、二重適用をサーバ側で拒否。
  2. 割引計算を 累積差額方式 ではなく「対象商品の %OFF 計算後で打ち切り」。
  3. 適用済みクーポンを セッションではなく DB トランザクション内 で管理。
  4. 単体テストに「交互適用・大量適用」ケースを追加し 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, (^^ゞ