
Joomla 6.1.3 - عالي - عن بُعد - ACL - GET /api/v1/users/levels يكشف مستويات العرض
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-levels-api
المقال التقني: https://abraxaslabs.tech/research/joomla-levels-api
الفئة: صلاحية متبقية الوصول: عن بُعد
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
المستخدمون من نوع Administrator -> عرض مستويات الوصول يتطلب core.admin على com_users (LevelController::allowSave والحذف). خدمة المجموعات (Groups webservice) تفعل الشيء نفسه بالفعل (GroupsController، 6.1.1). لا يحتوي LevelsController على أي تجاوز لـ allowAdd أو allowEdit أو delete، لذا يسمح ApiController بمرور core.manage بالإضافة إلى core.create.
يمكن لرمز API من فئة Manager، مُمنوح core.login.api دون core.admin، إنشاء مستويات وصول للعرض تحظرها واجهة المستخدم.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية / تجاوز التفويض |
| الوصول | عن بُعد (رمز API مع core.login.api) |
| CWE | CWE-863 |
| CVSS | متوسط: 6.1 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:N |
| المنتج | Joomla CMS |
| المتأثر | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| المصادقة | رمز API لـ Manager (المجموعة 6) مع core.login.api وcom_users manage/create/edit. بدون core.admin. القيمة الافتراضية لـ core.login.api هي Super User فقط. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
استخدام رمز API لمستخدم غير Super User لتغيير أي المجموعات ترى أي الصفحات. لا يصبحون Super User من هذه الصلاحية المتبقية وحدها. هذا تحكّم في رؤية المحتوى، وليس استيلاءً على الموقع.
| الصلاحية | الطريقة / المسار | النوع | مُثبت مختبريًا أم مُستنتج |
|---|---|---|---|
| إنشاء مستوى وصول للعرض | POST /api/index.php/v1/users/levels JSON title، rules (معرّفات المجموعات) | سلامة | مُثبت مختبريًا. HTTP 200، #__viewlevels id=7، العنوان poc-level-JOOMLA-LEVELS-API-WITNESS |
| تعديل مستوى موجود (قائمة المجموعات / العنوان) | PATCH /api/index.php/v1/users/levels/{id} | سلامة | مُستنتج. نفس المتحكم، بدون allowEdit. المختبر أنشأ فقط. |
| حذف مستوى | DELETE /api/index.php/v1/users/levels/{id} | سلامة / إتاحة صفوف ACL | مُستنتج. نفس التجاوز المفقود. لم يُنفّذ المختبر DELETE. |
| كشف مقال أو وحدة أو عنصر قائمة مخصص للأعضاء فقط | مستوى جديد أو مُعدّل تتضمن rules الخاصة به Public / Guest / Registered | استطلاع (رؤية المحتوى) | مُستنتج من #__viewlevels.rules. أدخل المختبر الصف؛ ولم يُعد ضبط ACL لمقال حي. |
| إخفاء صفحة عن Registered، أو إضافة مجموعة المهاجم إلى مستوى Special | نفس PATCH / الإنشاء | سلامة | مُستنتج. نفس المخزن. |
| تعديل مجموعات المستخدمين من API | POST /api/index.php/v1/users/groups | لا ينطبق | مُثبت مختبريًا مغلق. HTTP 403 (GroupsController core.admin) |
| فتح المستخدمون -> مستويات الوصول للعرض في لوحة الإدارة | GET /administrator/index.php?option=com_users&view=levels | لا ينطبق | مُثبت مختبريًا مغلق. HTTP 403 |
| حفظ مستوى من واجهة المستخدم | POST ... task=level.save | لا ينطبق | مُثبت مختبريًا مغلق. HTTP 403 (LevelController::allowSave يتطلب core.admin) |
استهداف API بـ Manager افتراضي (بدون core.login.api) | Bearer token / X-Joomla-Token | لا ينطبق | مُستنتج مغلق. القيمة الافتراضية لـ core.login.api هي Super User (المجموعة 8) فقط. يمنحه هذا المختبر للمجموعة 6 أولًا. |
| RCE عبر Super User / المثبّت | لا ينطبق | لا ينطبق | مغلق. يبقى Manager كما هو. |
ثبّتُ joomla/joomla-cms 6.1.3 بعد موجة JSST في 2026-07/08. تتطلب Groups API بالفعل core.admin. لا تزال مستويات العرض تمر عبر ApiController (core.manage بالإضافة إلى core.create / core.edit / core.delete). المنطق الإضافي الوحيد في LevelsController هو فك ترميز JSON لطلب PATCH الخاص بـ rules.
إصلاح Groups الشقيق:
public function allowAdd($data = [])
{
return $this->app->getIdentity()->authorise('core.admin', $this->option);
}
واجهة المستخدم للمسؤول:
protected function allowSave($data, $key = 'id')
{
return $this->app->getIdentity()->authorise('core.admin', $this->option)
&& parent::allowSave($data, $key);
}
المسارات الخاطئة المسجّلة مسبقًا: التعامل مع Groups API على أنه لا يزال مفتوحًا (إنه 403)؛ الوصول إلى الـ API بصفتك Manager عاديًا دون منح core.login.api أولًا (الافتراضي هو Super User فقط، نفس الإعداد كما في CVE-2026-71574 / 72531 / 48904)؛ قراءة 403 في واجهة المستخدم على أنها القصة كاملة (المتبقي هو الـ API). المسرح: reverse shell. المرجع الحاسم هو API 200 مع Groups 403 مع UI 403.
بقايا نفس التثبيت: menu items API، media override، articles catid.
python3 joomla-levels-api-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19520. الصورة joomla:6.1.3-php8.3-apache بالإضافة إلى mariadb:11.4.
SUCCESS joomla-levels-api api-http=200 level-id=7 groups-api=403 ui-view=403 ui-save=403 JOOMLA-LEVELS-API-WITNESS
انسخ allowAdd / allowEdit / delete الخاصة بـ core.admin من GroupsController إلى LevelsController. أبقِ بوابة واجهة المستخدم الخاصة بالمسؤول.
0f2d4de4729eb951e0878fec98c7990da07915b2)LevelsController.phpcore.admin (6.1.1) · CVE-2026-71574GNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.