
يفحص WordPress Core 4.7.0–7.1.1 بحثًا عن CVE-2026-87902، وهو LFI غير مُصادَق عليه عبر تجاوز pagename مزدوج الترميز، مع تصعيد اختياري إلى RCE عبر PEAR config-create وفحص جماعي.
أداة استغلال ثغرة اجتياز المسار في get_page_template() / locate_template() في نواة WordPress
للاختبار الأمني المُصرَّح به فقط. الوصول غير المُصرَّح به إلى أنظمة الحاسوب غير قانوني.
| العنصر | التفاصيل |
|---|---|
| معرّف CVE | CVE-2026-87902 |
| معرّف GHSA | GHSA-7hp8-65ch-5whp |
| نوع الثغرة | CWE-98 — التحكم غير السليم في اسم الملف الخاص بـ Include/Require |
| CVSS v3.1 | 8.1 (مرتفع) / CVSS 4.0: 9.2 (حرج) |
| المكوّن المتأثر | نواة WordPress |
| الإصدارات المتأثرة | 4.7.0 حتى 7.1.1 (جميع الفروع) |
| الإصدارات المُصلَحة | 7.1.2 (والترقيعات الرجعية وصولاً إلى 4.7.37) |
| المصادقة المطلوبة | لا شيء (غير مُصادَق عليه) |
| ناقل الهجوم | طلب GET واحد |
| المكتشِف | Robert Ressl (عبر برنامج HackerOne الخاص بـ WordPress) |
| تاريخ الإفصاح | 22 سبتمبر 2026 |
| استُغِلَّت في البرية | نعم — مُدرجة في كتالوج CISA KEV |
CVE-2026-87902 هي ثغرة اجتياز مسار وتضمين ملف محلي (LFI) غير مُصادَق عليها في نواة WordPress، تؤثر على كل إصدار من WordPress صدر منذ عام 2016 (4.7.0 حتى 7.1.1). لا يحتاج المهاجم إلى أي حساب أو مصادقة. من خلال صياغة معامل استعلام pagename خبيث، يمكن للمهاجم إجبار آلية تحديد قالب الصفحة في WordPress على تضمين أي ملف .php قابل للقراءة خارج دليل القالب النشط. وفي ظروف خادم محددة (PHP register_argc_argv = On وملف pearcmd.php قابل للقراءة)، يمكن تصعيد الثغرة إلى تنفيذ تعليمات برمجية عن بُعد (RCE).
| الفرع | الإصدار المُصلَح |
|---|---|
| 4.7.x | 4.7.37 |
| 5.0.x | 5.0.29 |
| 5.3.x | 5.3.25 |
| 5.9.x | 5.9.18 |
| 6.0.x | 6.0.16 |
| 6.6.x | 6.6.9 |
| 6.9.x | 6.9.9 |
| 7.0.x | 7.0.6 |
| 7.1.x | 7.1.2 |
تكمُن الثغرة في get_page_template() داخل wp-includes/template.php. عند وجود متغير الاستعلام pagename، تُنشئ الدالة page-{$pagename}.php لكنها تفشل في استدعاء validate_file() على تلك القيمة للتحقق من اجتياز الدليل. ثم يُمرَّر اسم الملف المرشَّح إلى locate_template()، التي تدمجه مع مسار دليل القالب وتتحقق فقط من file_exists() — دون التحقق من أن المسار المُحلَّل يبقى داخل دليل القالب. لذلك يمكن لاسم قالب يحتوي على ../ أن يُحلَّل إلى ملف PHP قابل للقراءة خارج القالب النشط، ثم يُضمَّن ويُنفَّذ.
GET /?page_id=&pagename= → WP_Query resolves page_id, matches a published page (avoids 404) → get_page_template() urldecode()s pagename, builds page-{$pagename}.php → locate_template() concatenates candidate to theme directory, resolves via file_exists() → template-loader executes realpath() + include
يُطبِّق WordPress الدالة sanitize_title_for_query() على pagename، التي تستبدل النقاط الحرفية (.) بشرطات (-) لمنع اجتياز المسار. وهي تعمل على مدخلات سبق فك ترميزها مرة واحدة ولا تفك الترميز بشكل متكرر. يرسل المهاجم %252e%252e%252f (وهو ../ مُرمَّز مرتين):
%252e ← %2e، و%252f ← %2fsanitize_title_for_query() القيمة %2e%2e%2f (بلا نقاط حرفية) فتمررها كما هيget_page_template() داخلياً urldecode() مرة أخرى: %2e%2e%2f ← ../page- (مثل page-templates/).page_id..php (يُضيف WordPress الامتداد).ملاحظة حول مضيفي Windows: تُطبِّع Win32 المسار .. معجمياً، لذا قد ينجح اجتياز المسار حتى إذا لم يكن دليل page- موجوداً. أما على Linux، فيجب أن يكون ذلك الدليل موجوداً فعلياً.
الشروط:
register_argc_argv في PHP على Onpearcmd.php قابل للقراءة على الخادميقوم المهاجم بتضمين pearcmd.php عبر LFI ويستغل أمر config-create الخاص به لكتابة ملف PHP على الخادم، ثم يضمّن ذلك الملف مرة أخرى عبر LFI لتنفيذ أوامر عشوائية.
تم اكتشاف CVE-2026-87902 والإبلاغ عنه من قبل Robert Ressl، وهو باحث أمني مقيم في سويسرا.
تم الإبلاغ عنه عبر برنامج HackerOne الخاص بـ WordPress في يوليو 2026. نسّق فريق أمان WordPress الإصلاح وأصدره إلى جانب WordPress 7.1.2 في 22 سبتمبر 2026.
| التاريخ | الحدث |
|---|---|
| يوليو 2026 | يبلّغ Robert Ressl عن الثغرة عبر برنامج HackerOne الخاص بـ WordPress |
| 22 سبتمبر 2026 | إصدار WordPress 7.1.2 مع الإصلاح؛ نشر الإشعار الأمني |
| 22 سبتمبر 2026 | إصدار تحديثات أمنية احتياطية للفروع من 7.0 حتى 4.7 |
| 23 سبتمبر 2026 | يبدأ المهاجمون بفحص المواقع المعرّضة للثغرة |
| 25 سبتمبر 2026 | تضيف CISA الثغرة CVE-2026-87902 إلى كتالوج KEV |
| الميزة | الوصف |
|---|---|
| تحديد بصمة الإصدار | يحدد إصدار WordPress عبر meta generator وخلاصة RSS وOPML وreadme.html و?ver= في الأصول |
| حكم ذكي على الإصدار | يستخدم تعيين الإصدارات المُصلحة لتحديد ما إذا كان الهدف ضمن النطاق المتأثر |
| اكتشاف القالب | يستخرج معرّف القالب النشط، ويكتشف القالب الأب، ويكتشف أدلة page-* |
| اكتشاف معرّفات الصفحات | يعثر على معرّفات صفحات صالحة عبر REST API وفئة الجسم page-id- والروابط المختصرة |
| التحقق عبر أوراكل LFI | يستخدم ملفات آمنة مثل wp-links-opml.php وwp-trackback.php كأوراكل مع ضوابط سلبية |
| اجتياز المسار مزدوج الترميز | يرمّز / و. ترميزًا مزدوجًا بنسبة مئوية تلقائيًا لتجاوز sanitize_title_for_query() |
| استغلال PEAR RCE | يجرّب مسارات PEAR الشائعة، ويكتب ملفات علامة وينفذها عبر config-create |
| الفحص الجماعي | فحص متزامن متعدد الخيوط لقوائم الأهداف |
| إخراج النتائج | يحفظ النتائج في vuln_lfi.txt وvuln_lfitorce.txt |
pip install requests
python3 CVE-2026-87902.py
القائمة التفاعلية:
[1] فحص فردي LFI [2] فحص فردي LFI + RCE [3] فحص جماعي LFI [4] فحص جماعي LFI + RCE [5] خروج
اختر [1]، ثم أدخل عنوان URL للهدف:
url > https://target.example.com
اختر [2]، ثم أدخل عنوان URL والأمر (الافتراضي id):
url > https://target.example.com cmd > id
اختر [3] أو [4]، ثم أدخل الملف الذي يحتوي على عناوين URL للأهداف (عنوان واحد في كل سطر، و# للتعليقات):
file > targets.txt
| الملف | المحتوى |
|---|---|
| vuln_lfi.txt | أهداف LFI المؤكدة |
| vuln_lfitorce.txt | أهداف RCE الناجحة |
TIMEOUT = 8 # Request timeout (seconds) THREADS = 200 # Concurrent threads for mass scanning USE_ALL_ORACLES = False # Use all oracles (more accurate but slower)
.. أو %2e أو %252e في المعامل pagename على مستوى WAF أو الوكيل العكسيpage-*register_argc_argv في PHPهذه الأداة مخصصة للاختبار الأمني المصرّح به والأغراض التعليمية فقط. يجب على المستخدمين التأكد من حصولهم على تصريح كتابي صريح للنظام المستهدف. قد يشكّل الاستخدام غير المصرّح به انتهاكًا لقانون CFAA وقانون إساءة استخدام الحاسوب في المملكة المتحدة وقوانين مماثلة في بلدان أخرى. لا يتحمل المؤلف أي مسؤولية عن أي إساءة استخدام.