
Joomla 6.1.3 - 높음 - 원격 - ACL - GET /api/v1/users/levels가 view levels를 유출함
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-levels-api
분류: 권한 잔여 도달 범위: 원격
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
관리자 Users -> Viewing Access Levels는 com_users에 대한 core.admin을 요구한다(LevelController::allowSave 및 delete). Groups 웹서비스는 이미 동일하게 동작한다(GroupsController, 6.1.1). LevelsController에는 allowAdd, allowEdit, delete 오버라이드가 없어서, ApiController가 core.manage와 core.create를 통과시킨다.
core.admin 없이 core.login.api를 부여받은 Manager 등급 API 토큰은 UI가 금지하는 viewing access level을 생성할 수 있다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여 / 인가 우회 |
| 도달 범위 | 원격 (core.login.api가 있는 API 토큰) |
| CWE | CWE-863 |
| CVSS | Medium: 6.1 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:N |
| 제품 | Joomla CMS |
| 영향받는 버전 | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| 인증 | core.login.api와 com_users manage/create/edit 권한을 가진 Manager(그룹 6)용 API 토큰. core.admin 없음. 기본 core.login.api는 Super User 전용. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
비-Super-User API 토큰을 사용해 어떤 그룹이 어떤 페이지를 볼 수 있는지를 변경한다. 이 잔여 권한만으로 Super User가 되지는 않는다. 이는 사이트 탈취가 아니라 콘텐츠 가시성 제어다.
| 권한 | 메서드 / 경로 | 종류 | 랩 입증 또는 추정 |
|---|---|---|---|
| viewing access level 생성 | POST /api/index.php/v1/users/levels JSON title, rules (그룹 id) | 무결성 | 랩 입증. HTTP 200, #__viewlevels id=7, title poc-level-JOOMLA-LEVELS-API-WITNESS |
| 기존 level 편집 (그룹 목록 / title) | PATCH /api/index.php/v1/users/levels/{id} | 무결성 | 추정. 동일 컨트롤러, allowEdit 없음. 랩에서는 생성만 수행. |
| level 삭제 | DELETE /api/index.php/v1/users/levels/{id} | 무결성 / ACL 행의 가용성 | 추정. 동일한 오버라이드 누락. 랩에서는 DELETE를 수행하지 않음. |
| 회원 전용 글, 모듈, 메뉴 항목 노출 | rules에 Public / Guest / Registered를 포함하는 신규 또는 패치된 level | 정찰 (콘텐츠 가시성) | #__viewlevels.rules에서 추정. 랩에서는 행을 삽입했으며, 실제 글의 ACL을 재설정하지는 않음. |
| Registered에서 페이지 숨기기, 또는 공격자의 그룹을 Special level에 추가 | 동일한 PATCH / create | 무결성 | 추정. 동일한 저장소. |
| API에서 사용자 그룹 변경 | POST /api/index.php/v1/users/groups | 해당 없음 | 랩 입증 차단됨. HTTP 403 (GroupsController core.admin) |
| 관리자에서 Users -> Viewing Access Levels 열기 | GET /administrator/index.php?option=com_users&view=levels | 해당 없음 | 랩 입증 차단됨. HTTP 403 |
| UI에서 level 저장 | POST ... task=level.save | 해당 없음 | 랩 입증 차단됨. HTTP 403 (LevelController::allowSave는 core.admin 요구) |
기본 Manager( core.login.api 없음)로 API 호출 | Bearer 토큰 / X-Joomla-Token | 해당 없음 | 추정 차단됨. 기본 core.login.api는 Super User(그룹 8) 전용. 이 랩에서는 먼저 그룹 6에 부여함. |
| Super User / 설치 프로그램 RCE | 해당 없음 | 해당 없음 | 차단됨. Manager는 Manager로 남음. |
2026-07/08 JSST 웨이브 이후 joomla/joomla-cms 6.1.3을 고정했다. Groups API는 이미 core.admin을 요구한다. View levels는 여전히 ApiController(core.manage와 core.create / core.edit / core.delete)를 통과한다. LevelsController의 유일한 추가 로직은 rules의 PATCH JSON 디코드뿐이다.
수정된 Groups 형제 컨트롤러:
public function allowAdd($data = [])
{
return $this->app->getIdentity()->authorise('core.admin', $this->option);
}
관리자 UI:
protected function allowSave($data, $key = 'id')
{
return $this->app->getIdentity()->authorise('core.admin', $this->option)
&& parent::allowSave($data, $key);
}
이미 기록된 잘못된 접근: Groups API가 여전히 열려 있다고 간주(실제로는 403); core.login.api를 먼저 부여하지 않고 기본 Manager로 API 호출(기본값은 Super User 전용이며, CVE-2026-71574 / 72531 / 48904와 동일한 설정); UI 403을 전부로 해석(잔여 권한은 API에 있음). 불필요한 시도: 리버스 셸. 판별 기준은 API 200, Groups 403, UI 403이다.
동일 고정 버전의 잔여 항목: menu items API, media override, articles catid.
python3 joomla-levels-api-Abraxas-Labs.py
또는
cd lab
./run.sh
대상은 오직 http://127.0.0.1:19520. 이미지 joomla:6.1.3-php8.3-apache와 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
GroupsController의 core.admin allowAdd / allowEdit / delete를 LevelsController에 복사한다. 관리자 UI 게이트는 유지한다.
0f2d4de4729eb951e0878fec98c7990da07915b2)LevelsController.phpcore.admin (6.1.1) · CVE-2026-71574GNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.