
OpenCart 4.1.0.4 रिवॉर्ड पॉइंट्स और Free Checkout पेमेंट बायपास के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट और लैब, जिससे एक प्रमाणित ग्राहक पॉइंट्स रख सकता है और ऑर्डर का कम भुगतान कर सकता है।
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 |
| Product | OpenCart |
| Affected | 4.1.0.4 तक reward + Free Checkout |
| Auth | प्रमाणित ग्राहक (गेस्ट कार्ट यह बग नहीं है) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
लॉग इन करें, पॉइंट्स से कवर होने वाला SKU कार्ट में डालें, इतने रिवॉर्ड लगाएँ कि Free Checkout सूची में दिखे, उस मेथड को सेव करें, फिर reward.save को 0 के साथ कॉल करें। दूसरा confirm कैटलॉग टोटल लिख देता है। free_checkout.confirm ऑर्डर को पेड में बढ़ा देता है। पॉइंट्स कभी डेबिट नहीं होते।
उन्हें शेल नहीं मिलता। गेस्ट चेकआउट यह बग नहीं है: रिवॉर्ड के लिए ग्राहक चाहिए। 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। सीड टैक्स और शिपिंग हटा देता है ताकि रिवॉर्ड 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
reward.save में payment_method को उसी तरह unset करें जैसे coupon.save पहले से करता है, और free_checkout.confirm को total > 0 पर मना करने दें।
reward.php · coupon.php · free_checkout.php controller · free_checkout.php model · confirm.phpGNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।