
Joomla 6.1.3 - Alta - Remota - ACL - residuo dell'API degli elementi di menu
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
Classe: Privilegio residuo Portata: Remota
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
L'interfaccia amministrativa per le voci di menu verifica com_menus.menu.{id} e rifiuta menutype == main. api/components/com_menus/src/Controller/ItemsController.php non ha allowAdd / allowEdit, quindi ApiController richiede solo core.manage più core.create / core.edit su com_menus.
Un utente con token che può gestire un menu può effettuare POST su /api/index.php/v1/menus/administrator/items verso un menu a cui è negato l'accesso nell'interfaccia, incluso il menu protetto main dell'amministratore.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo / bypass dell'autorizzazione |
| Portata | Remota (token API con 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 |
| Prodotto | Joomla CMS |
| Affetto | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| Auth | Utente API remoto con core.login.api + core.manage + core.create/core.edit su com_menus, non Super User. Il valore predefinito di core.login.api è solo Super User. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Utente con token che può creare voci solo sul menu A. Non può comunque installare estensioni a meno che non abbia già quel permesso. Non diventa Super User da questo residuo.
| Privilegio | Metodo / percorso | Tipo | Provato in lab o dedotto |
|---|---|---|---|
| Creare una voce su un menu a cui è negato l'accesso | POST /api/index.php/v1/menus/administrator/items con menutype di B | integrità | Provato in lab. HTTP 200, voce 102 su staffmenu, titolo poc-JOOMLA-MENU-ITEMS-API-WITNESS |
Inserire un URL sul menu protetto main dell'amministratore | Stesso POST con menutype=main | integrità | Provato in lab HTTP 200. L'interfaccia allowEdit restituisce false per main |
| Indirizzare lo staff verso un login simile o nascondere una voce admin reale | Voce URL pubblicata su un menu admin | integrità / ricognizione | Dedotto dalla scrittura. Il lab ha inserito https://example.invalid/ |
| Modificare o eliminare voci su menu di cui non sono proprietari | API PATCH / DELETE usa lo stesso allow* mancante | integrità | Dedotto. Il lab ha esercitato la creazione |
| Installare estensioni o diventare Super User | Richiede altre ACL | n/a | Chiuso. Il Manager non è Super User |
Chiuso su questo pin: aggiunta/salvataggio nell'interfaccia su staffmenu per lo stesso utente (not permitted). L'aggiunta nell'interfaccia su labmenu funziona ancora. Il gate core.admin dell'API Groups dalla 6.1.1 è intatto.
Ho fissato la 6.1.3 dopo l'ondata JSST del 2026. L'ItemController dell'amministratore fa già la cosa giusta:
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);
Il controller degli items dell'API non sovrascrive allowAdd / allowEdit. L'ApiController predefinito verifica solo core.manage del componente più core.create / core.edit. Il percorso canSave del modello verifica solo core.edit del componente. La copia/spostamento in batch verifica già l'asset del menu.
Vicoli ciechi già registrati: leggere HTTP 200 dell'interfaccia come permesso (il corpo è "not permitted"); considerare core.manage su com_menus sufficiente nell'interfaccia (l'interfaccia si basa comunque su com_menus.menu.{id}); un Manager standard senza core.login.api. Teatro: una reverse shell. L'oracolo è API 200 su staffmenu e main più la negazione nell'interfaccia su B.
Altri residui dello stesso pin: levels API, media override, articles catid.
python3 joomla-menu-items-api-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19530. Immagine 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 sono HTTP 200; la negazione di B è il corpo "not permitted" dell'interfaccia, non uno stato 403.
Copiare ItemController::allowAdd / allowEdit (e delete) sul controller dell'API, incluso il blocco main. Verificare l'asset del tipo di menu in canSave allo stesso modo.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.