
# ثغرة رفع ملفات تعسفي بدون مصادقة -> تنفيذ أوامر عن بُعد في WPLP Cookie Consent (gdpr-cookie-consent) <= 4.4.1 - توثيق تقني وإثبات المفهوم
إثبات المفهوم وتقرير تقني لـ CVE-2026-75865، وهو ثغرة رفع ملفات تعسفي بدون مصادقة تؤدي إلى تنفيذ كود عن بُعد في إضافة WPLP Cookie Consent – Cookie Banner & Consent Management for GDPR, CCPA & Google Consent Mode الخاصة بووردبريس (المعرّف gdpr-cookie-consent)، وتؤثر على جميع الإصدارات حتى 4.4.1 وما يشملها.
| الحقائق الأساسية |
|---|
| CVE | CVE-2026-75865 |
| الخطورة | حرجة — CVSS 3.1 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| مواطن الضعف | CWE-862 (غياب التفويض) + CWE-434 (رفع ملف غير مقيد بنوع خطير) |
| الإصدارات المتأثرة | gdpr-cookie-consent ≤ 4.4.1 |
| تم الإصلاح في | 4.4.2 |
| جهة تخصيص CVE | Wordfence |
| تاريخ النشر | 2026-09-01 |
| اكتشفه | Supakiad S. (m3ez) |
تقوم نقاط نهاية REST الخاصة بـ"الموصل" (connector) في الإضافة بمصادقة الطلبات عبر تفويض التحقق إلى تطبيق SaaS الخاص بالبائع، والذي يتحقق من صحة JWT من نوع Bearer — لكن الإضافة تتحقق فقط من أن نقطة نهاية التحقق تستجيب برمز HTTP 200. لا يوجد أي ربط ملكية بين JWT والموقع المستهدف، لذا يتم قبول أي رمز صالح صادر عن SaaS (مثل رمز من حساب مجاني).
ثم تقوم الدالة saas_upload_logo() بكتابة كتلة base64 مقدمة من المهاجم في الدليل العام wp-content/uploads/ تحت اسم ملف يحدده المهاجم، دون أي تحقق من المحتوى أو الامتداد. كما أن رمز API المخزّن (master_key) الذي يحرس نقطة النهاية أيضًا ليس سرًا فعليًا: فمسار /store-auth الخاص بالإضافة نفسه يستبدله من معاملات الطلب بعد نفس فحص JWT، لذا فإن السلسلة الكاملة — من طلب غير مصادق إلى حمولة منفذة في جذر الويب — تتطلب فقط عنوان URL مستهدفًا وحساب SaaS مجانيًا.
تم إصلاح الثغرة في الإصدار 4.4.2 بإزالة نقطة نهاية الرفع بالكامل وإعادة هيكلة نموذج الثقة الخاص بالموصل (ربط ملكية JWT، وhash_equals()، وتوقيع طلبات HMAC).
التحليل التقني الكامل: REPORT.md
| الملف | الوصف |
|---|---|
REPORT.md | تقرير تقني مفصّل: تحليل السبب الجذري مع كود مرجعي بالأسطر، ومقارنة الإصلاح 4.4.1 ← 4.4.2، وسلسلة الاستغلال، والكشف والتخفيف |
cve_2026_75865.py | سكربت إثبات المفهوم — يفحص قائمة أهداف، ويكتشف المواقع المعرضة للخطر، وينفذ السلسلة الكاملة (تعداد المسؤول ← استبدال المفتاح الرئيسي ← رفع الحمولة ← التحقق) مع مخرجات مباشرة |
payload.php | حمولة بسيطة غير ضارة تُستخدم افتراضيًا: تطبع سلسلة علامة وتدعم الحذف الذاتي (?delete=1) |
git clone https://github.com/ghostpels/CVE-2026-75865.git
cd CVE-2026-75865
pip install requests # colorama اختياري (سجلات ملونة)
# 1. احفظ JWT صالحًا من SaaS (أي حساب على app.wplegalpages.com) في ملف jwt.txt
# 2. أنشئ قائمة أهداف وشغّل فقط ضد الأنظمة المصرح لك باختبارها:
python cve_2026_75865.py -l targets.txt -o vuln.txt -t 40 --marker CVE-2026-75865-POC
يتم إلحاق عناوين URL للحمولات المؤكدة بملف vuln.txt مباشرة، سطرًا واحدًا لكل عنوان، فور التحقق من كل هدف.
| الخيار | الافتراضي | الوصف |
|---|---|---|
-l, --list | (مطلوب) | قائمة الأهداف، عنوان URL واحد لكل سطر |
-o, --output | vuln.txt | عناوين URL للحمولات المؤكدة، تُلحق مباشرة |
-t, --threads | 40 | عدد العمال المتزامنين |
--shell | payload.php | ملف الحمولة بجوار السكربت؛ الاسم المرفوع = اسمه الأساسي |
--filename | — | اسم ملف مرفوع مخصص (يُجرّب امتداده أولاً، ثم --exts) |
--exts | php,phtml,php5,php74,php7,php3,php4,phar | امتدادات احتياطية عند حظر الامتداد الأساسي |
--jwt-file | jwt.txt | JWT الخاص بـ SaaS، أول سطر غير فارغ |
--marker | — | سلسلة يجب أن تظهر في استجابة الحمولة لتُعتبر صالحة |
--timeout | 15 | مهلة كل طلب (بالثواني) |
-k, --insecure | إيقاف | تعطيل التحقق من TLS |
-v, --verbose | إيقاف | إظهار تفاصيل أخطاء الاتصال |
يُنشر هذا المستودع لأغراض البحث التعليمي والدفاعي الأمني فقط. استخدم الأداة حصريًا ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ناتج عن هذه المادة.