
OpenCart 4.1.0.4のreward pointsとFree Checkoutの支払いバイパスを組み合わせた、認証済み顧客がポイントを保持しつつ注文金額を過少支払いできる脆弱性のPoCエクスプロイトおよび検証ラボ。
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opencart-reward-free-checkout
OpenCart 4.1.0.4 - OpenCart Ltd
CVE-2025-15116 は 4.1.0.3 までのクーポンレースでした。4.1.0.4 では、coupon.save はクーポンが変更されると payment_method を unset します。reward.save はそうしません。getTotals が <= 0.00 になるのに十分なポイントを適用し、Free Checkout を選択してから、ポイントをクリアします。Confirm は保留中の行をカタログ価格に書き換えます。free_checkout.confirm はセッションの支払いコードのみをチェックします。
報酬ポイントを持つログイン済みの顧客は、カタログ SKU を Free Checkout として発送し、ポイントを保持できます。
| ID | CVE はまだありません |
| CWE | CWE-840, CWE-863 |
| CVSS | High: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 製品 | OpenCart |
| 影響範囲 | 4.1.0.4 までの reward + Free Checkout |
| 認証 | 認証済み顧客(ゲストカートはこのバグではありません) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
ログインし、ポイントでカバーされる SKU をカートに入れ、Free Checkout が表示されるのに十分な報酬を適用し、その支払い方法を保存してから、reward.save を 0 で実行します。2 回目の confirm はカタログ合計を書き込みます。free_checkout.confirm は注文を支払い済みに昇格させます。ポイントは決して引き落とされません。
シェルを取得するわけではありません。ゲストチェックアウトはこのバグではありません。reward には顧客が必要です。Free Checkout は total <= 0 のときのみ表示されます。バグは、ポイントをクリアしてもそれが非表示にならず、confirm が合計を再度見ないことです。
私は reward.save、次に coupon.save、次に getMethods(total <= 0.00)、次にステータスが 0 の間の editOrder、そして free_checkout.confirm を読みました。4.1.0.4 では、reward=0 は session.reward を削除します。payment_method には触れません。15116 のハードニング後のクーポンは触れます。
これを最初に見るクライアントは、100 ポイントを適用し、Free Checkout を選択し、一度 confirm して、正直なゼロ合計の注文を得るでしょう。それは機能であり、バグではありません。
すでに記録された誤った道:reward.save ではなく coupon.save(そのパスは支払い方法を unset します)、ゲストチェックアウト、points=0 の製品(Free Checkout は決して表示されません)、free_checkout.confirm を通じて reward をセッションに残す(正直な無料注文、ポイントは引き落とされるべき)、order_status_id=0 のみを見る(保留は支払い済みではありません)。オラクルは status 1, total 100.00, payment free_checkout, debit 0 です。
ラボ:顧客ログイン。カートに 36(iPod Nano、points=100)を追加。reward.save 100。支払い方法に Free Checkout が表示。それを保存。Confirm が注文 3 を 0 で書き込み。reward.save 0。Confirm が注文 4 を 100.00 で書き換え。free_checkout.confirm。シードは税と送料を落とすので、reward は getTotals を正確にゼロにできます。それはバグではありません。ポイントがその行をカバーするカタログ SKU が現実的なケースです。顧客はまだ 1000 を持っています。
cd lab
./run.sh
対象は http://127.0.0.1:18108 のみ。まず OpenCart 4.1.0.4 の upload/ を lab/www に配置してください。そのツリーはこのリポジトリには含まれていません。
SUCCESS OpenCart reward + Free Checkout underpay
IOC order-after-reward 3 total=0.0000 status=0 free_checkout.free_checkout
IOC order-after-clear 4 total=100.0000 status=0 free_checkout.free_checkout
IOC free_checkout.confirm redirect checkout/success
IOC order-final 4 total=100.0000 status=1 debit=0 balance=1000
coupon.save がすでに行っているように reward.save で payment_method を unset し、free_checkout.confirm が total > 0 を拒否するようにします。
reward.php · coupon.php · free_checkout.php controller · free_checkout.php model · confirm.phpGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。保証なし。