abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
类别: 权限残留 可达性: 远程
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
菜单项的管理员 UI 会检查 com_menus.menu.{id} 并拒绝 menutype == main。api/components/com_menus/src/Controller/ItemsController.php 没有 allowAdd / allowEdit,因此 ApiController 只要求 com_menus 上的 core.manage 以及 core.create / core.edit。
一个可以管理某个菜单的令牌用户,可以向他们在 UI 中被拒绝的菜单 POST /api/index.php/v1/menus/administrator/items,包括受保护的管理员 main 菜单。
| ID | 暂无 CVE |
| 类别 | 权限残留 / 授权绕过 |
| 可达性 | 远程(带有 core.login.api 的 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) |
| 认证 | 具有 core.login.api + core.manage + com_menus 上的 core.create/core.edit 的远程 API 用户,非超级用户。默认 core.login.api 仅限超级用户。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
令牌用户只能在菜单 A 上创建菜单项。除非他们已拥有该权限,否则仍无法安装扩展。他们不会因这一残留而成为超级用户。
| 权限 | 方法 / 路径 | 类型 | 实验验证或推断 |
|---|---|---|---|
| 在无权访问的菜单上创建菜单项 | 使用 B 的 menutype 执行 POST /api/index.php/v1/menus/administrator/items | 完整性 | 实验验证。HTTP 200,staffmenu 上的菜单项 102,标题 poc-JOOMLA-MENU-ITEMS-API-WITNESS |
在受保护的管理员 main 菜单上植入 URL | 使用 menutype=main 执行相同的 POST | 完整性 | 实验验证 HTTP 200。UI 的 allowEdit 对 main 返回 false |
| 将员工引导至仿冒登录页或隐藏真实管理菜单项 | 管理菜单上的已发布 URL 菜单项 | 完整性 / 侦察 | 根据写入推断。实验植入了 https://example.invalid/ |
| 编辑或删除他们不拥有的菜单上的菜单项 | API PATCH / DELETE 使用同样缺失的 allow* | 完整性 | 推断。实验仅验证了创建 |
| 安装扩展或成为超级用户 | 需要其他 ACL | 不适用 | 已排除。Manager 不是超级用户 |
在此版本上已排除:同一用户在 staffmenu 上的 UI 添加/保存(not permitted)。labmenu 上的 UI 添加仍然有效。6.1.1 的 Groups API core.admin 门控未受影响。
在 2026 JSST 浪潮之后,我锁定了 6.1.3。管理员 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。批量复制/移动已经检查了菜单资产。
已记录的弯路:将 UI 的 HTTP 200 视为允许(响应体是 "not permitted");认为 com_menus 上的 core.manage 在 UI 中已足够(UI 仍然依据 com_menus.menu.{id});一个没有 core.login.api 的默认 Manager。表演性质:反向 shell。判定依据是 staffmenu 和 main 上的 API 200 以及 B 上的 UI 拒绝。
同一版本的其他残留: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 的拒绝是 UI 的 "not permitted" 响应体,而非 403 状态码。
将 ItemController::allowAdd / allowEdit(以及 delete)复制到 API 控制器,包括 main 拦截。在 canSave 中以相同方式检查菜单类型资产。
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。