
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만 요구합니다.
하나의 메뉴를 관리할 수 있는 토큰 사용자는 UI에서 거부되는 메뉴, 보호된 관리자 main 메뉴를 포함하여, 해당 메뉴에 대해 POST /api/index.php/v1/menus/administrator/items를 실행할 수 있습니다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여 / 인가 우회 |
| 도달 범위 | 원격 (core.login.api가 있는 API 토큰) |
| CWE | CWE-863 |
| CVSS | 높음: 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 + core.manage + com_menus에 대한 core.create/core.edit를 가진 원격 API 사용자, 슈퍼 사용자 아님. 기본 core.login.api는 슈퍼 사용자 전용. |
| 라이선스 | GNU Affero GPL v3.0 |
| 실습 환경 | 127.0.0.1 전용 |
메뉴 A에만 항목을 생성할 수 있는 토큰 사용자. 해당 권한이 이미 없다면 여전히 확장을 설치할 수 없습니다. 이 잔여 권한으로 슈퍼 사용자가 되지는 않습니다.
| 권한 | 메서드 / 경로 | 종류 | 실습 증명 또는 추론 |
|---|---|---|---|
| 거부된 메뉴에 항목 생성 | B의 menutype으로 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* 사용 | 무결성 | 추론. 실습에서는 생성만 실행 |
| 확장 설치 또는 슈퍼 사용자 되기 | 다른 ACL 필요 | 해당 없음 | 차단됨. 관리자는 슈퍼 사용자 아님 |
이 핀에서 차단됨: 동일 사용자의 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 항목 컨트롤러는 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에 대한 거부는 403 상태가 아니라 UI의 "not permitted" 본문입니다.
ItemController::allowAdd / allowEdit(및 delete)를 main 블록을 포함하여 API 컨트롤러에 복사합니다. canSave에서 메뉴 유형 자산도 같은 방식으로 확인합니다.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 실험실 전용입니다. 보증하지 않습니다.