
Joomla 6.1.3 - عالي - عن بُعد - ACL - بقايا واجهة برمجة تطبيقات عناصر القائمة
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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، وليس مستخدمًا خارقًا. القيمة الافتراضية لـ core.login.api هي المستخدم الخارق فقط. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
مستخدم رمز مميز مسموح له بإنشاء عناصر على القائمة A فقط. لا يزال غير قادر على تثبيت الإضافات ما لم يكن يمتلك تلك الصلاحية بالفعل. لا يصبح مستخدمًا خارقًا من هذه الصلاحية المتبقية.
| الصلاحية | الطريقة / المسار | النوع | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| إنشاء عنصر على قائمة ممنوع منها | 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/ |
| تعديل أو حذف عناصر على قوائم لا يملكها | API PATCH / DELETE يستخدم نفس allow* المفقود | سلامة | مُستنتج. المختبر جرّب الإنشاء |
| تثبيت الإضافات أو أن يصبح مستخدمًا خارقًا | يحتاج ACL آخر | لا ينطبق | مغلق. المدير ليس مستخدمًا خارقًا |
مغلق على هذا الإصدار: إضافة/حفظ واجهة المستخدم على 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 فقط. لا ضمان.