
Joomla 6.1.3 - عالي - عن بُعد - ACL - بقايا واجهة برمجة تطبيقات عناصر القائمة
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
المقال: https://abraxaslabs.tech/research/joomla-menu-items-api
الفئة: صلاحية متبقية الوصول: عن بُعد
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
تتحقق واجهة المستخدم الإدارية لعناصر القوائم من com_menus.menu.{id} وترفض menutype == main. لا يحتوي api/components/com_menus/src/Controller/ItemsController.php على allowAdd / allowEdit، لذا يطلب ApiController فقط core.manage بالإضافة إلى core.create / core.edit على com_menus.
يمكن لمستخدم رمز مميز (token) يُسمح له بإدارة قائمة واحدة أن يرسل POST إلى /api/index.php/v1/menus/administrator/items على قائمة يُمنع منها في واجهة المستخدم، بما في ذلك قائمة المسؤول المحمية main.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية / تجاوز التفويض |
| الوصول | عن بُعد (رمز API مميز مع core.login.api) |
| CWE | CWE-863 |
| CVSS | عالٍ: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| المنتج | Joomla CMS |
| المتأثر | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| المصادقة | مستخدم API عن بُعد لديه core.login.api + core.manage + core.create/core.edit على com_menus، وليس Super User. القيمة الافتراضية لـ core.login.api هي Super User فقط. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
مستخدم رمز مميز يُسمح له بإنشاء عناصر على القائمة A فقط. لا يزال غير قادر على تثبيت الإضافات ما لم يكن يمتلك تلك الصلاحية مسبقًا. لا يصبح Super User من هذه الصلاحية المتبقية.
| الصلاحية | الطريقة / المسار | النوع | مُثبت في المختبر أم مُستنتج |
|---|---|---|---|
| إنشاء عنصر على قائمة يُمنع منها | POST /api/index.php/v1/menus/administrator/items مع menutype الخاص بـ B | سلامة البيانات | مُثبت في المختبر. HTTP 200، العنصر 102 على staffmenu، العنوان poc-JOOMLA-MENU-ITEMS-API-WITNESS |
زرع رابط على قائمة المسؤول المحمية main | نفس POST مع menutype=main | سلامة البيانات | مُثبت في المختبر HTTP 200. تُرجع واجهة المستخدم allowEdit القيمة false لـ main |
| توجيه الموظفين إلى صفحة تسجيل دخول مشابهة أو إخفاء عنصر إداري حقيقي | عنصر رابط منشور على قائمة إدارية | سلامة البيانات / استطلاع | مُستنتج من الكتابة. زرع المختبر https://example.invalid/ |
| تعديل أو حذف عناصر على قوائم لا يملكها | يستخدم PATCH / DELETE في API نفس allow* المفقود | سلامة البيانات | مُستنتج. نفّذ المختبر عملية الإنشاء |
| تثبيت الإضافات أو أن يصبح Super User | يحتاج إلى ACL أخرى | لا ينطبق | مغلق. المدير ليس Super User |
مغلق على هذا الإصدار المثبّت: إضافة/حفظ واجهة المستخدم على staffmenu لنفس المستخدم (not permitted). لا تزال إضافة واجهة المستخدم على labmenu تعمل. بوابة core.admin في Groups API من 6.1.1 لم تُمَس.
ثبّتُ 6.1.3 بعد موجة JSST لعام 2026. ItemController الإداري يفعل الشيء الصحيح بالفعل:
return $user->authorise('core.create', 'com_menus.menu.' . $menutypeID);
if ($item->menutype == 'main') {
return false;
}
return $user->authorise('core.edit', 'com_menus.menu.' . (int) $menutypeID);
وحدة تحكم عناصر API لا تتجاوز allowAdd / allowEdit. وحدة ApiController الافتراضية تتحقق فقط من المكوّن core.manage بالإضافة إلى core.create / core.edit. مسار canSave في النموذج يتحقق فقط من المكوّن core.edit. النسخ/النقل الدفعي يتحقق بالفعل من أصل القائمة.
المنعطفات الخاطئة المسجّلة مسبقًا: قراءة استجابة HTTP 200 من واجهة المستخدم على أنها سماح (النص هو "not permitted")؛ اعتبار core.manage على com_menus كافياً في واجهة المستخدم (لا تزال واجهة المستخدم تعتمد على com_menus.menu.{id})؛ مدير قياسي بدون core.login.api. المسرح: reverse shell. المرجع الحاسم هو استجابة API 200 على staffmenu وmain بالإضافة إلى رفض واجهة المستخدم على B.
بقايا نفس التثبيت: levels API، media override، articles catid.
python3 joomla-menu-items-api-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19530. الصورة joomla:6.1.3-php8.3-apache.
SUCCESS joomla-menu-items-api api-b-http=200 item-id=102 menutype=staffmenu api-main-http=200 ui-add-b=200 ui-save-b=200 JOOMLA-MENU-ITEMS-API-WITNESS
ui-add-b / ui-save-b هما HTTP 200؛ رفض B هو نص واجهة المستخدم "not permitted"، وليس حالة 403.
انسخ ItemController::allowAdd / allowEdit (والحذف) إلى وحدة تحكم API، بما في ذلك كتلة main. تحقق من أصل نوع القائمة في canSave بالطريقة نفسها.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.