
Joomla 6.1.3 - 高 - リモート - ACL - メニュー項目APIの残存
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
解説記事: https://abraxaslabs.tech/research/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 になることはありません。
| 権限 | メソッド / パス | 種別 | ラボ実証または推測 |
|---|---|---|---|
| 拒否されているメニューに項目を作成する | menutype を B にして POST /api/index.php/v1/menus/administrator/items | 完全性 | ラボ実証済み。HTTP 200、staffmenu 上の項目 102、タイトル poc-JOOMLA-MENU-ITEMS-API-WITNESS |
保護された管理者用 main メニューに URL を植え付ける | menutype=main で同じ POST | 完全性 | ラボ実証済み 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 の拒否です。
同じ pin の残骸: 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 の「許可されていません」という本文であり、403 ステータスではありません。
ItemController::allowAdd / allowEdit(および delete)を main ブロックを含めて API コントローラにコピーします。canSave 内のメニュータイプのアセットも同様にチェックします。
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。