
Joomla 6.1.3 - Alta - Remota - ACL - API de itens de menu remanescente
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
Classe: Privilégio remanescente Alcance: Remoto
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
A UI de administrador para itens de menu verifica com_menus.menu.{id} e recusa menutype == main. api/components/com_menus/src/Controller/ItemsController.php não possui allowAdd / allowEdit, então o ApiController apenas exige core.manage mais core.create / core.edit em com_menus.
Um usuário com token que pode gerenciar um menu consegue fazer POST em /api/index.php/v1/menus/administrator/items para um menu ao qual é negado na UI, incluindo o menu main protegido do administrador.
| ID | ainda sem CVE |
| Classe | Privilégio remanescente / bypass de autorização |
| Alcance | Remoto (token de API com core.login.api) |
| CWE | CWE-863 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produto | Joomla CMS |
| Afetado | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| Autenticação | Usuário remoto de API com core.login.api + core.manage + core.create/core.edit em com_menus, não Super User. O padrão de core.login.api é apenas Super User. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Usuário com token que pode criar itens apenas no menu A. Ele ainda não consegue instalar extensões a menos que já tenha essa permissão. Ele não se torna Super User a partir deste remanescente.
| Privilégio | Método / caminho | Tipo | Comprovado em lab ou inferido |
|---|---|---|---|
| Criar um item em um menu ao qual é negado | POST /api/index.php/v1/menus/administrator/items com menutype de B | integridade | Comprovado em lab. HTTP 200, item 102 em staffmenu, título poc-JOOMLA-MENU-ITEMS-API-WITNESS |
Plantar uma URL no menu main protegido do administrador | Mesmo POST com menutype=main | integridade | Comprovado em lab HTTP 200. A UI allowEdit retorna false para main |
| Direcionar a equipe para um login falso ou ocultar um item real de admin | Item de URL publicado em um menu de admin | integridade / recon | Inferido a partir da escrita. O lab plantou https://example.invalid/ |
| Editar ou excluir itens em menus que não possui | PATCH / DELETE da API usa o mesmo allow* ausente | integridade | Inferido. O lab exercitou a criação |
| Instalar extensões ou se tornar Super User | Precisa de outra ACL | n/a | Fechado. Manager não é Super User |
Fechado neste pin: adicionar/salvar na UI em staffmenu para o mesmo usuário (not permitted). Adicionar na UI em labmenu ainda funciona. O gate core.admin da API de grupos do 6.1.1 permanece intacto.
Fiz o pin do 6.1.3 após a onda JSST de 2026. O ItemController do administrador já faz a coisa certa:
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);
O controller de itens da API não sobrescreve allowAdd / allowEdit. O ApiController padrão apenas verifica core.manage do componente mais core.create / core.edit. O caminho canSave do model apenas verifica core.edit do componente. A cópia/movimentação em lote já verifica o asset do menu.
Caminhos errados já registrados: ler HTTP 200 da UI como permitido (o corpo é "not permitted"); tratar core.manage em com_menus como suficiente na UI (a UI ainda se baseia em com_menus.menu.{id}); um Manager padrão sem core.login.api. Teatro: um reverse shell. O oráculo é API 200 em staffmenu e main mais negação da UI em B.
Remanescentes do mesmo pin: levels API, media override, articles catid.
python3 joomla-menu-items-api-Abraxas-Labs.py
ou
cd lab
./run.sh
Alvo apenas http://127.0.0.1:19530. Imagem 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 são HTTP 200; a negação de B é o corpo "not permitted" da UI, não um status 403.
Copie ItemController::allowAdd / allowEdit (e delete) para o controller da API, incluindo o bloqueio de main. Verifique o asset do tipo de menu em canSave da mesma forma.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.