
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
Article : https://abraxaslabs.tech/research/joomla-menu-items-api
Classe : Privilège résiduel 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 n'a 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 protégé main de l'administrateur.
| ID | pas encore de CVE |
| Classe | Privilège résiduel / 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) |
| Authentification | 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 |
| Lab | 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 disposer déjà de cette permission. Il ne devient pas Super User à cause de ce privilège résiduel.
| Privilège | Méthode / chemin | Type | Prouvé en lab 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 lab. HTTP 200, élément 102 sur staffmenu, titre poc-JOOMLA-MENU-ITEMS-API-WITNESS |
Placer une URL sur le menu protégé main de l'administrateur | Même POST avec menutype=main | intégrité | Prouvé en lab 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 lab a placé https://example.invalid/ |
| Modifier ou supprimer des éléments sur des menus qu'il ne possède pas | PATCH / DELETE de l'API utilise les mêmes allow* manquants | intégrité | Déduit. Le lab 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 cette version : ajout/enregistrement dans l'interface sur staffmenu pour le même utilisateur (not permitted). L'ajout dans l'interface sur labmenu fonctionne toujours. Le contrôle core.admin de l'API Groups depuis 6.1.1 est inchangé.
J'ai épinglé la version 6.1.3 après la vague JSST de 2026. Le ItemController de l'administrateur 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 d'éléments de l'API ne redéfinit pas allowAdd / allowEdit. Le ApiController par défaut ne vérifie que le composant core.manage plus core.create / core.edit. Le chemin canSave du modèle ne vérifie que le composant core.edit. La copie/déplacement par lots vérifie déjà l'asset du menu.
Fausses pistes déjà consignées : lire un HTTP 200 de l'UI comme une autorisation (le corps est « not permitted ») ; considérer que core.manage sur com_menus suffit dans l'UI (l'UI se base toujours sur com_menus.menu.{id}) ; un Manager standard sans core.login.api. Mise en scène : un reverse shell. L'oracle est un 200 de l'API sur staffmenu et main plus un refus de l'UI sur B.
Mêmes restes d'épinglage : levels API, media override, articles catid.
python3 joomla-menu-items-api-Abraxas-Labs.py
ou
cd lab
./run.sh
Ciblez 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 renvoient HTTP 200 ; le refus de B est le corps « not permitted » de l'interface, et non un statut 403.
Copiez ItemController::allowAdd / allowEdit (ainsi que la suppression) sur le contrôleur de l'API, y compris le bloc main. Vérifiez l'asset de type menu dans canSave de la même manière.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. Voir LICENSE. Laboratoire en boucle locale uniquement. Aucune garantie.