
Joomla 6.1.3 – Hoch – Remote – ACL – API-Reste bei Menüeinträgen
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
Klasse: Privilegien-Überrest Reichweite: Remote
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
Die Administrator-Oberfläche für Menüeinträge prüft com_menus.menu.{id} und verweigert menutype == main. api/components/com_menus/src/Controller/ItemsController.php hat kein allowAdd / allowEdit, daher fragt ApiController nur nach core.manage plus core.create / core.edit auf com_menus.
Ein Token-Benutzer, der ein Menü verwalten darf, kann /api/index.php/v1/menus/administrator/items auf ein Menü per POST schreiben, für das ihm in der Oberfläche der Zugriff verweigert wird, einschließlich des geschützten Administrator-Menüs main.
| ID | noch keine CVE |
| Klasse | Privilegien-Überrest / Autorisierungsumgehung |
| Reichweite | Remote (API-Token mit core.login.api) |
| CWE | CWE-863 |
| CVSS | Hoch: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produkt | Joomla CMS |
| Betroffen | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| Auth | Remote-API-Benutzer mit core.login.api + core.manage + core.create/core.edit auf com_menus, kein Super User. Standardmäßig ist core.login.api nur für Super User. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Token-Benutzer, der nur auf Menü A Einträge erstellen darf. Er kann weiterhin keine Erweiterungen installieren, es sei denn, er hat bereits diese Berechtigung. Durch diesen Überrest wird er nicht zum Super User.
| Privileg | Methode / Pfad | Art | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
| Einen Eintrag in einem Menü erstellen, für das ihm der Zugriff verweigert wird | POST /api/index.php/v1/menus/administrator/items mit menutype von B | Integrität | Im Lab nachgewiesen. HTTP 200, Eintrag 102 auf staffmenu, Titel poc-JOOMLA-MENU-ITEMS-API-WITNESS |
Eine URL im geschützten Administrator-Menü main platzieren | Derselbe POST mit menutype=main | Integrität | Im Lab nachgewiesen HTTP 200. UI allowEdit gibt für main false zurück |
| Mitarbeiter auf eine nachgeahmte Anmeldeseite lenken oder einen echten Admin-Eintrag verbergen | Veröffentlichter URL-Eintrag in einem Admin-Menü | Integrität / Recon | Aus dem Schreibzugriff abgeleitet. Im Lab wurde https://example.invalid/ platziert |
| Einträge in Menüs bearbeiten oder löschen, die ihm nicht gehören | API PATCH / DELETE nutzt dasselbe fehlende allow* | Integrität | Abgeleitet. Im Lab wurde das Erstellen getestet |
| Erweiterungen installieren oder Super User werden | Benötigt andere ACL | n/a | Geschlossen. Manager ist kein Super User |
Geschlossen bei diesem Pin: UI-Hinzufügen/Speichern auf staffmenu für denselben Benutzer (not permitted). UI-Hinzufügen auf labmenu funktioniert weiterhin. Das core.admin-Gate der Groups-API aus 6.1.1 ist unberührt.
Ich habe 6.1.3 nach der JSST-Welle 2026 gepinnt. Der Administrator-ItemController macht bereits das Richtige:
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);
Der API-Items-Controller überschreibt allowAdd / allowEdit nicht. Der Standard-ApiController prüft nur Komponenten-core.manage plus core.create / core.edit. Der canSave-Pfad des Modells prüft nur Komponenten-core.edit. Batch-Kopieren/Verschieben prüft bereits das Menü-Asset.
Bereits dokumentierte Irrwege: UI-HTTP 200 als Erlaubnis lesen (der Body ist "not permitted"); core.manage auf com_menus in der UI als ausreichend betrachten (die UI richtet sich weiterhin nach com_menus.menu.{id}); ein Standard-Manager ohne core.login.api. Theater: eine Reverse Shell. Das Orakel ist API 200 auf staffmenu und main plus UI-Verweigerung auf B.
Überreste desselben Pins: levels API, media override, articles catid.
python3 joomla-menu-items-api-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur 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 sind HTTP 200; die Verweigerung von B ist der UI-Body "not permitted", kein 403-Status.
Kopiere ItemController::allowAdd / allowEdit (und delete) auf den API-Controller, einschließlich des main-Blocks. Prüfe das Menütyp-Asset in canSave auf dieselbe Weise.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.