
Joomla 6.1.3 - Hoch - Remote - ACL - GET /api/v1/users/levels gibt Zugriffsebenen preis
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-levels-api
Klasse: Privilegien-Überrest Reichweite: Remote
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
Administrator-Benutzer -> Zugriffsebenen anzeigen erfordert core.admin auf com_users (LevelController::allowSave und Löschen). Der Groups-Webservice macht bereits dasselbe (GroupsController, 6.1.1). LevelsController hat keine allowAdd-, allowEdit- oder delete-Überschreibung, sodass ApiController core.manage plus core.create durchlässt.
Ein API-Token der Manager-Klasse, dem core.login.api ohne core.admin gewährt wurde, kann Zugriffsebenen erstellen, die die UI verbietet.
| ID | noch keine CVE |
| Klasse | Privilegien-Überrest / Autorisierungsumgehung |
| Reichweite | Remote (API-Token mit core.login.api) |
| CWE | CWE-863 |
| CVSS | Mittel: 6.1 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:N |
| Produkt | Joomla CMS |
| Betroffen | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| Auth | API-Token für Manager (Gruppe 6) mit core.login.api und com_users manage/create/edit. Kein core.admin. Standardmäßig ist core.login.api nur für Super User. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Verwenden Sie ein API-Token eines Nicht-Super-Users, um zu ändern, welche Gruppen welche Seiten sehen. Sie werden durch diesen Überrest allein nicht zum Super User. Dies ist Kontrolle über die Sichtbarkeit von Inhalten, keine Übernahme der Website.
| Privileg | Methode / Pfad | Art | Im Lab bewiesen oder abgeleitet |
|---|---|---|---|
| Eine Zugriffsebene erstellen | POST /api/index.php/v1/users/levels JSON title, rules (Gruppen-IDs) | Integrität | Im Lab bewiesen. HTTP 200, #__viewlevels id=7, Titel poc-level-JOOMLA-LEVELS-API-WITNESS |
| Eine bestehende Ebene bearbeiten (Gruppenliste / Titel) | PATCH /api/index.php/v1/users/levels/{id} | Integrität | Abgeleitet. Derselbe Controller, kein allowEdit. Im Lab nur erstellt. |
| Eine Ebene löschen | DELETE /api/index.php/v1/users/levels/{id} | Integrität / Verfügbarkeit von ACL-Zeilen | Abgeleitet. Dieselbe fehlende Überschreibung. Im Lab wurde kein DELETE durchgeführt. |
| Einen nur für Mitglieder bestimmten Artikel, ein Modul oder einen Menüeintrag offenlegen | Neue oder gepatchte Ebene, deren rules Public / Guest / Registered enthalten | Recon (Inhaltssichtbarkeit) | Abgeleitet aus #__viewlevels.rules. Im Lab wurde die Zeile eingefügt; es wurde kein Live-Artikel neu per ACL abgesichert. |
| Eine Seite vor Registered verbergen oder die Gruppe des Angreifers zu einer Special-Ebene hinzufügen | Dasselbe PATCH / Erstellen | Integrität | Abgeleitet. Derselbe Speicher. |
| Benutzergruppen über die API verändern | POST /api/index.php/v1/users/groups | n/a | Im Lab bewiesen geschlossen. HTTP 403 (GroupsController core.admin) |
| Benutzer -> Zugriffsebenen anzeigen im Administrator öffnen | GET /administrator/index.php?option=com_users&view=levels | n/a | Im Lab bewiesen geschlossen. HTTP 403 |
| Eine Ebene über die UI speichern | POST ... task=level.save | n/a | Im Lab bewiesen geschlossen. HTTP 403 (LevelController::allowSave erfordert core.admin) |
Die API mit einem Standard-Manager ansprechen (ohne core.login.api) | Bearer-Token / X-Joomla-Token | n/a | Abgeleitet geschlossen. Standardmäßig ist core.login.api nur für Super User (Gruppe 8). Dieses Lab gewährt es zuerst Gruppe 6. |
| Super User / Installer RCE | n/a | n/a | Geschlossen. Manager bleibt Manager. |
Ich habe joomla/joomla-cms 6.1.3 nach der JSST-Welle 2026-07/08 gepinnt. Die Groups-API erfordert bereits core.admin. View levels fallen weiterhin durch ApiController (core.manage plus core.create / core.edit / core.delete). Die einzige zusätzliche Logik in LevelsController ist das PATCH-JSON-Dekodieren von rules.
Behobenes Groups-Gegenstück:
public function allowAdd($data = [])
{
return $this->app->getIdentity()->authorise('core.admin', $this->option);
}
Administrator-UI:
protected function allowSave($data, $key = 'id')
{
return $this->app->getIdentity()->authorise('core.admin', $this->option)
&& parent::allowSave($data, $key);
}
Bereits dokumentierte Irrwege: die Groups-API als weiterhin offen zu behandeln (sie liefert 403); die API als Standard-Manager anzusprechen, ohne zuvor core.login.api zu gewähren (Standard ist nur Super User, gleiches Setup wie CVE-2026-71574 / 72531 / 48904); UI-403 als die ganze Geschichte zu lesen (der Überrest ist die API). Theater: eine Reverse Shell. Das Orakel ist API 200 plus Groups 403 plus UI 403.
Überreste desselben Pins: menu items API, media override, articles catid.
python3 joomla-levels-api-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur http://127.0.0.1:19520. Image joomla:6.1.3-php8.3-apache plus mariadb:11.4.
SUCCESS joomla-levels-api api-http=200 level-id=7 groups-api=403 ui-view=403 ui-save=403 JOOMLA-LEVELS-API-WITNESS
Kopieren Sie GroupsController core.admin allowAdd / allowEdit / delete auf LevelsController. Behalten Sie das Administrator-UI-Gate bei.
0f2d4de4729eb951e0878fec98c7990da07915b2)LevelsController.phpcore.admin (6.1.1) · CVE-2026-71574GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.