
CVE-2026-97657 के लिए Python PoC: Abandoned Cart Pro ≤10.8.0 में XOR malleability के माध्यम से AES-CTR recovery tokens को forge करके authentication को bypass करना और WordPress accounts पर कब्ज़ा करना।
CVE-2026-97657 के लिए Python 3 PoC — Abandoned Cart Pro for WooCommerce (Tyche Softwares) ≤ 10.8.0। CNA: Wordfence।
| उत्पाद | Abandoned Cart Pro for WooCommerce |
| प्रभावित | ≤ 10.8.0 (10.8.0 से ऊपर के किसी निश्चित रिलीज़ में अपग्रेड करें) |
| CWE | CWE-639 — उपयोगकर्ता-नियंत्रित कुंजी के माध्यम से प्रमाणीकरण बायपास |
| CVSS 3.1 | 9.8 Critical |
| सत्यापन मार्कर | POCBIT-97657-OK (सत्र/व्यवस्थापक जाँच) |
| PoCbit | https://pocbit.org/pocs/cve-2026-97657 |
रिकवरी लिंक MAC-रहित AES-CTR टोकन का उपयोग करते हैं (Wcal_Aes_Ctr-संगत लेआउट: 8-बाइट CTR नॉनस + सिफरटेक्स्ट, base64)। प्लगइन हमलावर-नियंत्रित user_email क्वेरी पैरामीटर से प्रति-ईमेल encrypt_key लोड करता है। wcap_email_track_links() (Pro; Lite समकक्ष wcal_email_track_links()) में, wcap_nonce / HMAC जाँच केवल तब चलती है जब wcap_nonce गैर-रिक्त हो, इसलिए इसे छोड़ने से अखंडता सत्यापन छूट जाता है। डिक्रिप्शन के बाद, abandoned_id (कार्ट पंक्ति ID) का उपयोग यह सिद्ध किए बिना किया जाता है कि वह उस ईमेल से संबंधित है, फिर जब ऑटो-लॉगिन सक्षम हो (डिफ़ॉल्ट) तो wp_set_auth_cookie() चलता है।
अपने स्वयं के रिमाइंडर ईमेल से एक वैध रिकवरी URL रखने वाला एक अप्रमाणित हमलावर CTR सिफरटेक्स्ट को XOR-मैनिपुलेट करके एम्बेडेड कार्ट ID को पीड़ित के छोड़े गए कार्ट ID (स्रोत ID के समान लंबाई) में बदल सकता है, wcap_nonce के बिना नकली URL खोल सकता है, और पीड़ित के रूप में लॉग इन कर सकता है (जिसमें वे व्यवस्थापक भी शामिल हैं जिन्होंने कार्ट छोड़ा था)।
विशिष्ट URL स्वरूप (Pro):
GET /?wacp_action=checkout_link&[email protected]&validate=<token>
(wcap_action / wcal_action वेरिएंट मौजूद हैं; track-links URL में c= जैसे अतिरिक्त पैरामीटर शामिल हो सकते हैं।)
cd CVE-2026-97657
pip install -r requirements.txt
requests, urllib3| मोड | उद्देश्य | आवश्यक आर्ग्युमेंट |
|---|---|---|
check (डिफ़ॉल्ट) | प्लगइन readme.txt पढ़ें, संस्करण ≤ 10.8.0 को चिह्नित करें | -t URL या --list FILE |
forge | स्थानीय रूप से फ़ोर्ज्ड रिकवरी URL बनाएँ (कोई HTTP नहीं) | --recovery-link, --source-cart-id, --target-cart-id |
exploit | टोकन फ़ोर्ज करें + HTTP GET + WordPress सत्र सत्यापित करें | forge के समान |
अनुशंसित कार्यप्रवाह (अधिकृत लैब):
check — प्लगइन स्लग + संस्करण ≤ 10.8.0 की पुष्टि करें।forge — ट्रैफ़िक भेजने से पहले कार्ट ID पैडिंग और URL आकार को सत्यापित करें।exploit — फ़ोर्ज्ड रिकवरी URL पर एक GET; कुकीज़ + /wp-admin/ की पुष्टि करें।Exploit/forge -t / --list का उपयोग नहीं करता। लक्ष्य होस्ट --recovery-link (स्कीम + होस्ट) से लिया जाता है।
| आवश्यकता | क्यों |
|---|---|
| एक वैध रिकवरी URL | एक मान्य CTR नॉन्स + सिफरटेक्स्ट और (आमतौर पर) ac_sent_history में आपकी user_email / encrypt_key पंक्ति प्रदान करता है |
| प्लगइन ≤ 10.8.0 जिसमें auto-login सक्षम हो (डिफ़ॉल्ट) | पैच किए गए बिल्ड या अक्षम auto-login wp_set_auth_cookie() को अवरुद्ध करते हैं |
| पीड़ित पंजीकृत WordPress उपयोगकर्ता जिसके पास abandoned cart पंक्ति हो | टेकओवर पथ ac_abandoned_cart_history से user_id के रूप में लॉग इन करता है; शुद्ध गेस्ट कार्ट एक अलग शाखा का उपयोग करते हैं |
checkout_link URL को दृढ़ता से प्राथमिकता दी जाती है | प्लेनटेक्स्ट {abandoned_cart_id}&url=... है। track_links टोकन email_sent_id को एन्कोड करते हैं, कार्ट ID को नहीं — गलत ID प्रकार forge को तोड़ देता है |
| समान-लंबाई वाली ID | CTR XOR malleability केवल बाइट्स को 1:1 पलटती है; शून्य से पैड करें (नीचे देखें) |
--recovery-link प्राप्त करनाcheckout_link कॉपी करें (या webhooks / प्लगइन एक्सपोर्ट से यदि सक्षम हो)।उदाहरण Pro आकार (विक्रेता दस्तावेज़ / webhooks से):
https://shop.example/?wacp_action=checkout_link&validate=<base64-token>
https://shop.example/?wacp_action=checkout_link&[email protected]&validate=<token>
https://shop.example/?wacp_action=track_links&[email protected]&validate=<token>&c=<coupon-token>
URL को ईमेल में बिल्कुल वैसे ही पेस्ट करें (जिसमें validate शामिल हो; क्वेरी का क्रम मायने नहीं रखता)।
| स्रोत | फ़ील्ड |
|---|---|
| WooCommerce Abandoned Cart → Cart details (एडमिन) | Abandoned cart ID (DB प्राथमिक कुंजी) |
Webhook पेलोड (wcap_cart, checkout_link संदर्भ) | कार्ट संसाधन पर "id": "383" |
| MySQL (लैब) | wp_ac_abandoned_cart_history.id (Pro तालिका उपसर्ग भिन्न हो सकता है) |
--source-cart-id आपके टोकन के plaintext के अंदर वाली ID होनी चाहिए (आपकी abandoned cart पंक्ति)। --target-cart-id उसी तालिका में पीड़ित की पंक्ति है।
PoC असमान लंबाइयों को अस्वीकार करता है। दोनों ID को समान चौड़ाई तक पैड करें:
| स्रोत (आपका) | लक्ष्य (पीड़ित) | ठीक है? |
|---|---|---|
383 | 001 | हाँ (3 अक्षर) |
0383 | 0001 | हाँ (4 अक्षर) |
383 | 1 | नहीं — इसके बजाय 0383 / 0001 के साथ forge चलाएँ |
| फ़्लैग | मोड | अर्थ |
|---|---|---|
-t, --target | check | WordPress साइट रूट, जैसे https://shop.example.com |
--list FILE | check | प्रति पंक्ति एक साइट URL; # टिप्पणियाँ अनदेखी |
--mode | all | check (डिफ़ॉल्ट), forge, exploit |
--recovery-link URL | forge, exploit | रिमाइंडर ईमेल से पूर्ण recovery URL |
--source-cart-id | forge, exploit | आपकी abandoned cart पंक्ति ID (टोकन plaintext में) |
--target-cart-id | forge, exploit | पीड़ित की abandoned cart पंक्ति ID (समान स्ट्रिंग लंबाई) |
-j N | check (list) | समानांतर वर्कर (डिफ़ॉल्ट 8) |
--timeout SEC | check, exploit | HTTP टाइमआउट (डिफ़ॉल्ट 15) |
--insecure | check, exploit | TLS प्रमाणपत्र सत्यापन अक्षम करें |
--jsonl FILE | check, exploit | प्रति रन एक JSON ऑब्जेक्ट जोड़ें |
--vuln-list FILE | check | संस्करण ≤ 10.8.0 वाले URL लिखें |
-q, --quiet | all | कम कंसोल आउटपुट |
--no-color | all | सादा टर्मिनल |
एग्ज़िट कोड
| कोड | कब |
|---|---|
| 0 | Exploit: success: true; forge: हमेशा; check: हमेशा (एकल -t) |
| 1 | Exploit: लॉगिन/एडमिन सत्यापन विफल |
| 2 | Check सूची रन बिना -t सेमांटिक्स के (सूचनात्मक) |
python poc.py -t https://shop.example.com --mode check
python poc.py --list targets.example.txt --mode check -j 16 --vuln-list hits.txt --jsonl scan.jsonl
जाँच:
/wp-content/plugins/woocommerce-abandon-cart-pro/readme.txtwoocommerce-abandoned-cart-propython poc.py --mode forge \
--recovery-link "https://shop.example.com/?wacp_action=checkout_link&[email protected]&validate=..." \
--source-cart-id "0383" \
--target-cart-id "0001"
आउटपुट JSON में exploit_url शामिल होता है (validate से HMAC सफ़िक्स हटाया गया, nonce पैरामीटर हटाए गए)।
PoC मूल लिंक पर मौजूद होने पर क्वेरी से wcap_nonce / wcal_nonce को भी हटा देता है।
--mode exploit)स्थानीय टोकन फ़ॉर्जरी करता है और फिर एकल unauthenticated HTTP GET (साथ में redirect follows) करता है। कोई WordPress क्रेडेंशियल नहीं भेजे जाते।