
Joomla 6.1.3 - عالي - عن بُعد - استبدال - استبدال متبقٍّ في مدير الوسائط
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-media-override
الفئة: صلاحية متبقية الوصول: عن بُعد
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
CVE-2026-48947 علّم واجهة برمجة وسائط خدمة الويب أن تطلب core.edit عند تعيين override. لكن واجهة JSON API الخاصة بالموقع لا تزال لا تفعل ذلك. المستخدم الافتراضي Author لديه core.create على com_media وليس لديه core.edit. يعتبر موزّع الموقع أن core.create كافٍ ويحمّل ApiController الخاص بالمسؤول. ثم تمرّر postFiles() قيمة override مباشرة إلى createFile().
يمكن لمستخدم Author عادي استبدال ملف موجود بالفعل على القرص. يستمر الزوار في الوصول إلى نفس الرابط العام ويحصلون على البايتات الجديدة.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية / سلامة |
| الوصول | عن بُعد (Author افتراضي، بدون رمز API) |
| CWE | CWE-863، CWE-639 |
| CVSS | متوسط: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| المنتج | Joomla CMS |
| المتأثر | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2)، واجهة JSON API الخاصة بـ com_media في الموقع |
| المصادقة | Author افتراضي (المجموعة 3). بدون رمز API. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
تسجيل الدخول كمستخدم Author عادي واستبدال ملف موجود بالفعل على الموقع. هذا تشويه / تبديل خادع للوسائط المخزّنة، وليس استيلاءً على الموقع. قائمة حظر الامتدادات لم تتغير، لذا هذا ليس رفع ملف .php.
| الصلاحية | الطريقة / المسار | النوع | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| الكتابة فوق ملف وسائط موجود (شعار، صورة مقال) | الموقع POST /index.php?option=com_media&task=api.files&format=json&path=local-images:/ مع JSON override: true | سلامة | مُثبت مختبريًا. HTTP 200، تغيّر SHA على القرص، طلب GET العام /images/joomla_black.png قدّم ملف PNG الجديد الذي يحمل JOOMLA-MEDIA-OVERRIDE-WITNESS |
| تشويه أي شيء لا يزال يشير إلى ذلك الرابط | نفس المسار العام، بدون كسر التخزين المؤقت | سلامة | مُثبت مختبريًا أن البايتات العامة تغيّرت. مُستنتج لمحولات أخرى تحت images/ |
| إنشاء ملف مسموح جديد | نفس POST بدون override | مقصود | Author لديه core.create على com_media |
| التعديل عبر PUT | PUT لنفس المهمة، المسار يتضمن اسم الملف | لا ينطبق | مُثبت مختبريًا مغلق. HTTP 403. putFiles() تتطلب بالفعل core.edit |
| الإنشاء عندما يكون الاسم موجودًا، بدون override | POST override: false (افتراضي) | لا ينطبق | مُثبت مختبريًا مغلق. HTTP 409، SHA الأصلي لم يتغير حتى POST الـ override |
رفع .php أو أنواع مرفوضة أخرى | قائمة حظر createFile / isMediaFile | لا ينطبق | مُستنتج مغلق. هذا المختبر يرسل PNG فقط |
| استدعاء واجهة برمجة وسائط خدمة الويب مع override | /api/index.php/v1/media/files | لا ينطبق | مُستنتج مغلق. MediaController::allowAdd تتحقق من core.edit عند تعيين override (CVE-2026-48947) |
| Super User / RCE | لا ينطبق | لا ينطبق | مغلق. Author يبقى Author |
ثبّتّ 6.1.3 بعد موجة JSST في 2026-07/08. واجهة Groups API تتطلب بالفعل core.admin. وسائط خدمة الويب تتطلب بالفعل core.edit عند override. لكن المتحكم الداخلي لا يزال لا يفعل ذلك.
المستخدم الافتراضي Author لديه core.create على com_media ولا شيء في core.edit:
{"core.admin":{"7":1},"core.manage":{"6":1},"core.create":{"3":1},"core.delete":{"5":1}}
موزّع الموقع Dispatcher يسمح بمرور core.create ويحمّل ApiController الخاص بالمسؤول. ثم postFiles():
if (!$this->app->getIdentity()->authorise('core.create', 'com_media')) {
throw new \Exception(Text::_('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED'), 403);
}
$override = $content->get('override', false);
if ($mediaContent) {
$name = $this->getModel()->createFile($adapter, $name, $path, $mediaContent, $override);
خدمة الويب المُصلحة (api/.../MediaController.php):
if ($this->input->json->get('override', false)) {
return $user->authorise('core.edit', 'com_media');
}
المنعطفات الخاطئة المسجّلة بالفعل: اعتبار PUT هو الصلاحية المتبقية (PUT بالفعل 403)؛ اعتبار مسار خدمة الويب لا يزال مفتوحًا (CVE-2026-48947 أغلقه)؛ قراءة 409 بدون override كخطأ (هذا هو مسار الإنشاء-إذا-غاب المقصود). مسرحية: reverse shell. الدليل هو POST override 200 بالإضافة إلى PUT 403 بالإضافة إلى GET العام لملف PNG الشاهد.
نفس بقايا التثبيت: levels API، menu items API، articles catid.
python3 joomla-media-override-Abraxas-Labs.py
أو
cd lab
./run.sh
الهدف فقط http://127.0.0.1:19540. الصورة joomla:6.1.3-php8.3-apache بالإضافة إلى mariadb:11.4.
SUCCESS joomla-media-override post-http=200 override=yes bytes-changed=yes put-http=403 no-edit=yes conflict-http=409 JOOMLA-MEDIA-OVERRIDE-WITNESS
نفس فحص override -> core.edit كما في MediaController::allowAdd داخل ApiController::postFiles() قبل createFile(). أبقِ PUT على core.edit.
0f2d4de4729eb951e0878fec98c7990da07915b2)ApiController.php postFilesGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. بدون ضمان.