
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
Write-up: https://abraxaslabs.tech/research/joomla-levels-api
Klasse: Übrig gebliebenes Privileg 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 Überschreibung für allowAdd, allowEdit oder delete, 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 zum Anzeigen erstellen, die die UI verbietet.
| ID | noch keine CVE |
| Klasse | Übrig gebliebenes Privileg / Umgehung der Autorisierung |
| 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) |
| Authentifizierung | 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 |
Ein API-Token eines Nicht-Super-Users verwenden, um zu ändern, welche Gruppen welche Seiten sehen. Allein durch dieses übrig gebliebene Privileg werden sie nicht zum Super User. Dies ist eine Kontrolle der Inhaltsichtbarkeit, keine Übernahme der Website.
| Privileg | Methode / Pfad | Art | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
| Eine Zugriffsebene zum Anzeigen erstellen | POST /api/index.php/v1/users/levels JSON title, rules (Gruppen-IDs) | Integrität | Im Lab nachgewiesen. 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 ausgefü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 gesichert. |
| 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 nachgewiesen 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 nachgewiesen geschlossen. HTTP 403 |
| Eine Ebene über die UI speichern | POST ... task=level.save | n/a | Im Lab nachgewiesen geschlossen. HTTP 403 (LevelController::allowSave erfordert core.admin) |
Die API mit einem Standard-Manager (ohne core.login.api) ansprechen | 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 die PATCH-JSON-Dekodierung von rules.
Korrigiertes Groups-Geschwister:
public function allowAdd($data = [])
{
return $this->app->getIdentity()->authorise('core.admin', $this->option);
}
Administrator-Oberfläche:
protected function allowSave($data, $key = 'id')
{
return $this->app->getIdentity()->authorise('core.admin', $this->option)
&& parent::allowSave($data, $key);
}
Bereits erfasste Fehlversuche: die Groups-API als weiterhin offen zu behandeln (sie ist 403); die API als einfacher Manager anzusprechen, ohne zuvor core.login.api zu gewähren (Standard ist nur Super User, gleiches Setup wie CVE-2026-71574 / 72531 / 48904); den UI-403 als die ganze Geschichte zu lesen (der Rest ist die API). Theater: eine Reverse Shell. Das Orakel ist API 200 plus Groups 403 plus UI 403.
Gleiche Pin-Überbleibsel: 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
Kopiere GroupsController core.admin allowAdd / allowEdit / delete auf LevelsController. Behalte 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.