
Joomla 6.1.3 - Élevé - À distance - ACL - API des éléments de menu résiduelle
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
Classe : Reliquat de privilège Portée : Distante
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
L'interface d'administration des éléments de menu vérifie com_menus.menu.{id} et refuse menutype == main. api/components/com_menus/src/Controller/ItemsController.php ne possède pas de allowAdd / allowEdit, donc ApiController ne demande que core.manage plus core.create / core.edit sur com_menus.
Un utilisateur disposant d'un jeton qui peut gérer un menu peut envoyer un POST vers /api/index.php/v1/menus/administrator/items sur un menu auquel il est refusé dans l'interface, y compris le menu administrateur protégé main.
| ID | pas encore de CVE |
| Classe | Reliquat de privilège / contournement d'autorisation |
| Portée | Distante (jeton API avec core.login.api) |
| CWE | CWE-863 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produit | Joomla CMS |
| Affecté | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| Auth | Utilisateur API distant avec core.login.api + core.manage + core.create/core.edit sur com_menus, pas Super User. Par défaut, core.login.api est réservé au Super User. |
| Licence | GNU Affero GPL v3.0 |
| Labo | 127.0.0.1 uniquement |
Utilisateur disposant d'un jeton qui peut créer des éléments uniquement sur le menu A. Il ne peut toujours pas installer d'extensions à moins de posséder déjà cette permission. Il ne devient pas Super User à cause de ce reliquat.
| Privilège | Méthode / chemin | Type | Prouvé en labo ou déduit |
|---|---|---|---|
| Créer un élément sur un menu auquel il est refusé | POST /api/index.php/v1/menus/administrator/items avec menutype de B | intégrité | Prouvé en labo. HTTP 200, élément 102 sur staffmenu, titre poc-JOOMLA-MENU-ITEMS-API-WITNESS |
Placer une URL sur le menu administrateur protégé main | Même POST avec menutype=main | intégrité | Prouvé en labo HTTP 200. L'interface allowEdit renvoie false pour main |
| Rediriger le personnel vers une page de connexion factice ou masquer un véritable élément d'administration | Élément URL publié sur un menu d'administration | intégrité / reconnaissance | Déduit de l'écriture. Le labo a placé https://example.invalid/ |
| Modifier ou supprimer des éléments sur des menus qu'il ne possède pas | API PATCH / DELETE utilise le même allow* manquant | intégrité | Déduit. Le labo a exercé la création |
| Installer des extensions ou devenir Super User | Nécessite d'autres ACL | n/a | Fermé. Le Manager n'est pas Super User |
Fermé sur ce pin : ajout/enregistrement via l'interface sur staffmenu pour le même utilisateur (not permitted). L'ajout via l'interface sur labmenu fonctionne toujours. Le contrôle core.admin de l'API Groups depuis 6.1.1 est intact.
J'ai épinglé 6.1.3 après la vague JSST 2026. Le contrôleur administrateur ItemController fait déjà ce qu'il faut :
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);
Le contrôleur API des éléments ne surcharge pas allowAdd / allowEdit. Le ApiController par défaut ne vérifie que core.manage du composant plus core.create / core.edit. Le chemin canSave du modèle ne vérifie que core.edit du composant. La copie/déplacement par lot vérifie déjà l'asset du menu.
Fausses pistes déjà consignées : lire un HTTP 200 de l'interface comme une autorisation (le corps est "not permitted") ; considérer core.manage sur com_menus comme suffisant dans l'interface (l'interface se base toujours sur com_menus.menu.{id}) ; un Manager standard sans core.login.api. Théâtre : un reverse shell. L'oracle est un HTTP 200 de l'API sur staffmenu et main plus un refus de l'interface sur B.
Autres reliquats du même pin : API levels, surcharge media, catid articles.
python3 joomla-menu-items-api-Abraxas-Labs.py
ou
cd lab
./run.sh
Cible uniquement http://127.0.0.1:19530. Image 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 sont des HTTP 200 ; le refus de B est le corps "not permitted" de l'interface, pas un statut 403.
Copier ItemController::allowAdd / allowEdit (et delete) sur le contrôleur API, y compris le bloc main. Vérifier l'asset du type de menu dans canSave de la même manière.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. Voir LICENSE. Labo en boucle locale uniquement. Aucune garantie.