
Joomla 6.1.3 - 高 - リモート - ACL - メニュー項目APIの残存
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
クラス: 権限の取り残し 到達性: リモート
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
メニュー項目の管理者 UI は com_menus.menu.{id} をチェックし、menutype == main を拒否します。api/components/com_menus/src/Controller/ItemsController.php には allowAdd / allowEdit が存在しないため、ApiController は com_menus に対する core.manage と core.create / core.edit のみを要求します。
1 つのメニューを管理できるトークンユーザーは、UI では拒否されているメニュー、保護された管理者用 main メニューを含めて、/api/index.php/v1/menus/administrator/items に POST できます。
| ID | CVE 未採番 |
| クラス | 権限の取り残し / 認可バイパス |
| 到達性 | リモート (core.login.api を持つ API トークン) |
| CWE | CWE-863 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 製品 | Joomla CMS |
| 影響を受けるバージョン | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| 認証 | core.login.api + com_menus に対する core.manage + core.create/core.edit を持つリモート API ユーザー。Super User ではない。デフォルトの core.login.api は Super User のみ。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
メニュー A でのみ項目を作成できるトークンユーザー。その権限をすでに持っていない限り、拡張機能をインストールすることはできません。この取り残しによって Super User になることはありません。
| 権限 | メソッド / パス | 種類 | ラボ実証または推測 |
|---|---|---|---|
| 拒否されているメニューに項目を作成 | POST /api/index.php/v1/menus/administrator/items に B の menutype を指定 | 完全性 | ラボ実証済み。HTTP 200、staffmenu 上の項目 102、タイトル poc-JOOMLA-MENU-ITEMS-API-WITNESS |
保護された管理者用 main メニューに URL を設置 | 同じ POST に menutype=main を指定 | 完全性 | ラボ実証済み HTTP 200。UI の allowEdit は main に対して false を返す |
| スタッフを偽のログイン画面に誘導、または実際の管理者項目を隠す | 管理者メニュー上の公開 URL 項目 | 完全性 / 偵察 | 書き込みから推測。ラボでは https://example.invalid/ を設置 |
| 所有していないメニューの項目を編集または削除 | API の PATCH / DELETE は同じ欠落した allow* を使用 | 完全性 | 推測。ラボでは作成を実行 |
| 拡張機能のインストールまたは Super User 化 | 他の ACL が必要 | 該当なし | 不可。Manager は Super User ではない |
このピンで不可: 同じユーザーによる staffmenu の UI 追加/保存 (not permitted)。labmenu の UI 追加は依然として機能します。6.1.1 の Groups API core.admin ゲートは変更されていません。
2026 年の JSST の波の後、6.1.3 をピン留めしました。管理者用 ItemController はすでに正しい処理を行っています:
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);
API の items コントローラーは allowAdd / allowEdit をオーバーライドしていません。デフォルトの ApiController はコンポーネントの core.manage と core.create / core.edit のみをチェックします。モデルの canSave パスはコンポーネントの core.edit のみをチェックします。バッチコピー/移動はすでにメニューアセットをチェックしています。
すでに記録済みの誤った道: UI の HTTP 200 を許可と読み取ること (本文は "not permitted")。UI において com_menus の core.manage を十分とみなすこと (UI は依然として com_menus.menu.{id} を基準にする)。core.login.api を持たない標準の Manager。茶番: リバースシェル。オラクルは staffmenu と main に対する API 200、および B に対する UI 拒否です。
同じピンの取り残し: levels API、media override、articles catid。
python3 joomla-menu-items-api-Abraxas-Labs.py
または
cd lab
./run.sh
ターゲットは http://127.0.0.1:19530 のみ。イメージ 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 は HTTP 200 です。B の拒否は UI の "not permitted" 本文であり、403 ステータスではありません。
ItemController::allowAdd / allowEdit (および delete) を main ブロックを含めて API コントローラーにコピーします。canSave でメニュータイプのアセットを同じようにチェックします。
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。