WordPressで考える Flawed enforcement of business rules|クーポン割引が無限に使えるロジック欠陥

※本記事にはプロモーションが含まれています。

今回は、PortSwiggerのWeb Security Academyにあるラボ「Flawed enforcement of business rules」を解説します。

このラボでは、ECサイトのクーポン割引の処理ロジックに問題があり、本来は1回しか使えないはずの割引が何度でも適用できてしまう脆弱性を扱っています。

一見するとクーポン機能は正常に動いているように見えます。
しかし、ビジネスルール(業務ルール)のチェック方法に抜け穴があり、攻撃者がそのルールを回避できてしまいます。

このような問題は、ECサイトや会員サイトなどWordPressでも十分に起きる可能性があります。

ビジネスロジック脆弱性は、XSSやSQLインジェクションのような典型的な脆弱性とは少し性質が異なります。

しかし、Webアプリケーションの基本的なセキュリティ知識を理解しているとこうした設計ミスにも気づきやすくなります。

Webセキュリティの基礎を体系的に学びたい場合は、この本が定番です。

ラボの概要|クーポンコードを交互に使うと割引が増え続ける

このラボは、ECサイトの購入フローにあるクーポン処理の設計ミスを突く問題です。

利用できるクーポンは次の2つです。

  • NEWCUST5(新規ユーザー割引)
  • SIGNUP30(ニュースレター登録割引)

通常は、これらのクーポンは1回しか使えない仕様になっています。

しかし、アプリケーションのチェック方法に問題があり、2つのクーポンを交互に使うと何度でも適用できてしまいます。

その結果、本来は購入できない高額商品でも、価格をどんどん下げて購入できてしまいます。


攻撃の流れ|クーポンを交互に入力して価格を下げる

このラボでは、次の手順で攻撃を行います。

  1. wiener:peter でログイン
  2. クーポンコード NEWCUST5 を確認
  3. ニュースレター登録で SIGNUP30 を取得
  4. ジャケットをカートに追加
  5. クーポンを適用
  6. 2つのクーポンを交互に入力
  7. 商品価格がどんどん下がる
  8. ストアクレジットで購入可能になる

【攻撃フロー】

ログイン

クーポンAを適用

クーポンBを適用

クーポンAを再度適用

クーポンBを再度適用

割引が無限に積み重なる

このように、クーポンの利用回数チェックをすり抜けてしまいます。


なぜこの脆弱性が発生するのか|クーポン利用回数のチェック不足

この問題が起きる原因は、クーポンの利用履歴を正しくチェックしていないことです。

システムは次のような単純なチェックしかしていません。

  • 同じクーポンを連続で使うとエラー
  • しかし、別のクーポンを挟むと再び使える

つまり、「直前のクーポンしかチェックしていない」という設計ミスがあります。

本来は、

  • このユーザーが使ったクーポン一覧
  • この注文で使ったクーポン

すべて確認する必要があります。

しかし、その処理が抜けているため、ビジネスルールを回避できてしまうのです。


Flawed enforcement of business rulesの意味

Flawed enforcement of business rules」を分解すると意味が分かりやすくなります。

  • Flawed – 欠陥のある
  • Enforcement – ルールの強制
  • Business rules – 業務ルール(サービスの仕様)

つまりこのラボは、「業務ルールの適用方法に欠陥がある」という意味です。

プログラム自体が壊れているわけではなく、ルールのチェック方法が間違っていることが問題です。


ビジネスルールとは

ビジネスルールとは、サービスが守るべき業務上のルールのことです。

例えばECサイトには、次のようなルールがあります。

  • クーポンは1人1回まで
  • ポイントは購入金額までしか使えない
  • 在庫が0の商品は購入できない

これらはプログラムのバグではなく、サービスの仕様(運用ルール)です。

このようなルールが正しくチェックされていないと、攻撃者はその隙を突いて不正な操作ができてしまいます。

例えば今回のラボでは、

  • クーポンは1回しか使えない
    というビジネスルールがあるのに
  • クーポンを交互に入力すると何度でも使える

という問題が発生しています。


なぜこれはビジネスロジック脆弱性なのか

この脆弱性は、SQLインジェクションやXSSのような「入力値の不正利用」ではありません。

問題は、サービスのルールそのものにあります。

例えばこのECサイトのルールは次のようなものです。

  • クーポンは1回だけ使える
  • 割引は1回だけ適用される

しかし実際の処理では、ルールが正しく強制されていません。

その結果

  • 割引が無限に適用できる
  • 商品価格が異常に下がる

という問題が発生します。

このように、業務ルールの設計ミスを突く攻撃ビジネスロジック脆弱性と呼びます。


WordPressに置き換えるとどうなる│WooCommerceのクーポン機能で起きる可能性

では、この問題がWordPressサイトで起きたらどうなるでしょうか。

例えば、WooCommerceを使ったECサイトを考えてみます。

次のようなクーポンを用意していたとします。

  • 初回購入クーポン:500円OFF
  • メルマガ登録クーポン:30%OFF

本来は、1人1回のみ利用可能という仕様です。

しかし、次のようなチェックしかしていなかった場合です。

同じクーポンの連続使用を禁止すると攻撃者は

500円OFF

30%OFF

500円OFF

30%OFF

というようにクーポンを交互に入力し、何度でも割引を適用できてしまいます。

【WordPressサイトで起きる場合】

商品をカートに入れる

クーポンA適用

クーポンB適用

クーポンA再適用

割引が何度も加算される

このように、ECサイトの価格計算が壊れてしまう可能性があります。


WordPressサイトでクーポン悪用を防ぐ対策ポイント

WordPressサイトでこの問題を防ぐためには、次のポイントが重要です。

クーポン利用履歴のチェック

例えば、次のような確認を行います。

  • このユーザーがすでに使ったクーポン
  • この注文で使ったクーポン
  • 割引回数の上限

また、WooCommerceでは、

  • クーポンの利用回数制限
  • ユーザーごとの使用回数制限

などの設定を必ず確認しておく必要があります。


設計視点で見ると何が問題だったのか

このラボの本質は、システムがユーザーを信用しすぎていることです。

開発者は、

  • 同じクーポンは連続で入力されない
  • ユーザーは普通の使い方をする

と考えていました。

しかし実際には、攻撃者は仕様の穴を探して操作します。

その結果、本来あり得ない割引が成立してしまいます。


ビジネスロジック脆弱性を防ぐ設計チェックリスト

ECサイト設計では、次のチェックが重要です。

  • クーポンは本当に1回しか使えないか
  • 割引計算は毎回正しく再計算されているか
  • クーポン履歴をサーバー側で管理しているか
  • 同じ注文で複数クーポンが使えない仕様か
  • 割引の最大上限が設定されているか

ECサイト診断で確認すべきポイント

ECサイトの診断では次の点を確認します。

  • クーポンを何回も入力できないか
  • 別のクーポンを挟むと再利用できないか
  • 割引計算がマイナスにならないか
  • 割引が100%以上にならないか

これらは実際のECサイトでも、非常によく見つかるロジックバグです。


まとめ|クーポン処理の設計ミスは大きな被害につながる

今回のラボでは、クーポン利用ルールのチェック不足によって、割引が何度でも適用できてしまう問題を学びました。

このような問題は、

  • ECサイト
  • 会員サイト
  • サブスクサービス

などでも発生する可能性があります。

特にWordPressでは、WooCommerceのクーポン設定が原因で同様の問題が起きるケースもあります。

「入力値のバグ」だけでなく、サービスのルール設計にも注意することが重要です。


よくある疑問

Q. クーポンを複数使えるのは普通では?

サイトによっては複数クーポンを使える場合があります。
しかし、その場合でも割引の上限は必ず設定されています。

Q. WooCommerceは安全ですか?

WooCommerce自体にはクーポン制限機能があります。
ただし、プラグインやカスタム開発によってロジックが崩れる可能性があります。

Q. この攻撃は実際にありますか?

あります。
ECサイトでは、クーポン無限使用や割引計算ミス、ポイント二重利用などのロジックバグが実際に報告されています。

Q. なぜセキュリティテストで見逃されるのですか?

この問題は、通常の操作では気づきにくいためです。
攻撃者のように、順序を変える・何度も試すことで初めて見つかります。


このブログの運営環境

  • WordPress
  • GeneratePress
  • エックスサーバー

エックスサーバー公式サイト