
Joomla 6.1.3 - 높음 - 원격 - 덮어쓰기 - 미디어 관리자 덮어쓰기 잔여물
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-media-override
분류: 권한 잔여 도달 범위: 원격
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
CVE-2026-48947은 웹서비스 미디어 API가 override가 설정된 경우 core.edit을 요구하도록 만들었다. 사이트 JSON API는 여전히 그렇지 않다. 기본 Author는 com_media에 대한 core.create를 가지고 있고 core.edit은 없다. 사이트 디스패처는 core.create를 충분한 것으로 간주하고 관리자 ApiController를 로드한다. 그런 다음 postFiles()가 override를 createFile()로 그대로 전달한다.
기본 Author가 이미 디스크에 있는 파일을 교체할 수 있다. 방문자는 계속 같은 공개 URL에 접속하지만 새로운 바이트를 받게 된다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여 / 무결성 |
| 도달 범위 | 원격 (기본 Author, API 토큰 없음) |
| CWE | CWE-863, CWE-639 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 제품 | Joomla CMS |
| 영향 받는 버전 | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2), 사이트 com_media JSON API |
| 인증 | 기본 Author (그룹 3). API 토큰 없음. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
기본 Author로 로그인하여 사이트에 이미 있는 파일을 교체한다. 이는 사이트 탈취가 아니라 저장된 미디어의 변조 / 바이트 스위치이다. 확장자 거부 목록은 변경되지 않았으므로 .php 업로드가 아니다.
| 권한 | 메서드 / 경로 | 종류 | 랩 입증 또는 추론 |
|---|---|---|---|
| 기존 미디어 파일(로고, 기사 이미지) 덮어쓰기 | 사이트 POST /index.php?option=com_media&task=api.files&format=json&path=local-images:/에 JSON override: true | 무결성 | 랩 입증. HTTP 200, 디스크 SHA 변경됨, 공개 GET /images/joomla_black.png가 JOOMLA-MEDIA-OVERRIDE-WITNESS를 포함한 새 PNG를 제공함 |
| 해당 URL을 여전히 가리키는 모든 것 변조 | 동일한 공개 경로, 캐시 무효화 없음 | 무결성 | 공개 바이트가 바뀌는 것은 랩 입증. images/ 아래 다른 어댑터에 대해서는 추론 |
| 허용된 새 파일 생성 | override 없이 동일한 POST | 의도된 동작 | Author는 com_media에 대한 core.create를 가짐 |
| PUT을 통한 편집 | 동일한 task에 PUT, 경로에 파일 이름 포함 | 해당 없음 | 랩 입증 차단됨. HTTP 403. putFiles()는 이미 core.edit을 요구함 |
| 이름이 존재할 때 override 없이 생성 | POST override: false (기본값) | 해당 없음 | 랩 입증 차단됨. HTTP 409, override POST 전까지 원본 SHA 변경 없음 |
.php 또는 기타 거부된 유형 업로드 | createFile / isMediaFile 거부 목록 | 해당 없음 | 추론상 차단됨. 이 랩은 PNG만 전송함 |
| override로 웹서비스 미디어 API 호출 | /api/index.php/v1/media/files | 해당 없음 | 추론상 차단됨. MediaController::allowAdd는 override가 설정된 경우 core.edit을 확인함 (CVE-2026-48947) |
| Super User / RCE | 해당 없음 | 해당 없음 | 차단됨. Author는 Author로 남음 |
2026-07/08 JSST 웨이브 이후 6.1.3을 고정했다. Groups API는 이미 core.admin을 요구한다. 웹서비스 미디어는 override 시 이미 core.edit을 요구한다. 내부 컨트롤러는 여전히 그렇지 않다.
기본 Author는 com_media에 대한 core.create를 가지고 있고 core.edit에는 아무것도 없다:
{"core.admin":{"7":1},"core.manage":{"6":1},"core.create":{"3":1},"core.delete":{"5":1}}
사이트 Dispatcher는 core.create를 통과시키고 관리자 ApiController를 로드한다. 그런 다음 postFiles():
if (!$this->app->getIdentity()->authorise('core.create', 'com_media')) {
throw new \Exception(Text::_('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED'), 403);
}
$override = $content->get('override', false);
if ($mediaContent) {
$name = $this->getModel()->createFile($adapter, $name, $path, $mediaContent, $override);
수정된 웹서비스 (api/.../MediaController.php):
if ($this->input->json->get('override', false)) {
return $user->authorise('core.edit', 'com_media');
}
이미 기록된 잘못된 방향: PUT을 잔여로 취급하는 것 (PUT은 이미 403); 웹서비스 경로가 여전히 열려 있다고 취급하는 것 (CVE-2026-48947이 닫았음); override 없는 409를 실패로 읽는 것 (그것은 의도된 create-if-absent 경로임). 연극: 리버스 셸. 오라클은 POST override 200 더하기 PUT 403 더하기 witness PNG의 공개 GET이다.
동일한 고정 버전의 잔여: levels API, menu items API, articles catid.
python3 joomla-media-override-Abraxas-Labs.py
또는
cd lab
./run.sh
오직 http://127.0.0.1:19540만 대상으로 한다. 이미지 joomla:6.1.3-php8.3-apache 더하기 mariadb:11.4.
SUCCESS joomla-media-override post-http=200 override=yes bytes-changed=yes put-http=403 no-edit=yes conflict-http=409 JOOMLA-MEDIA-OVERRIDE-WITNESS
createFile() 전에 ApiController::postFiles() 내부에 MediaController::allowAdd와 동일한 override -> core.edit 검사를 추가한다. PUT은 core.edit으로 유지한다.
0f2d4de4729eb951e0878fec98c7990da07915b2)ApiController.php postFilesGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.