Отчет по аудиту безопасности модуля OpenCart Lightning v4.58
Разобрал и деобфусцировал код модуля Lightning 4.58, полностью прошелся по логике работы. Ниже тезисно собрал все найденные косяки, уязвимости и потенциально опасные закладки от автора, которые мы вычистили и исправили.
====================================================================
1. SQL-ИНЪЕКЦИИ (SQLi)
====================================================================
В модуле нашлось несколько мест с прямыми уязвимостями к SQL-инъекциям:
1.1. Параметр convert в special.php (строка ~1137)
Переменная бралась напрямую из $_GET['convert'] без какой-либо санитизации, приведения типов или проверки по белому списку:
$Mis = $_GET["convert"];
$db->query("SHOW TABLE STATUS WHERE Name = '$Mis'");
$db->query("ALTER TABLE `$Mis` ENGINE=INNODB");
Сюда можно было спокойно прокинуть пейлоад и дописать свои SQL-конструкции.
1.2. Прямое выполнение произвольного SQL (special.php, строки ~2419 и ~2610)
В функциях профилирования и объяснения запросов:
$Magj = $db->query("EXPLAIN " . $Mhj);
$Mbm = $db->query($Mhj);
Переменная $Mhj приходила извне. Любой запрос выполнялся к базе напрямую без валидации. При доступе к методу это давало возможность выполнить абсолютно любой произвольный SQL (чтение таблиц, UPDATE, DROP и т.д.).
1.3. Конкатенация переменных без экранирования (special.php, строки ~2065, ~2133)
В паре мест переменные вроде $lang_to и $Mik['language_id'] подставлялись напрямую в текст запроса через точку, без приведения к (int) и без $db->escape().
====================================================================
2. ФАЙЛОВЫЕ УЯЗВИМОСТИ (Path Traversal, LFI, удаленный код)
====================================================================
2.1. Чтение произвольных файлов сервера (special.php, функция Wek)
Просмотрщик логов брал путь из $_GET['log']:
$Mdk = strip_tags($Mdk);
if (strpos($Mdk, "..") !== false) exit;
file_get_contents($path . $Mdk);
Проверка только на ".." крайне слабая и при определенных условиях обходится. Это классический Path Traversal, позволяющий читать системные файлы и конфиги сайта.
2.2. Поиск по всему дереву файлов (special.php, маршрут li_op=search)
Функция Wmr рекурсивно парсила папки DIR_SYSTEM и DIR_STORAGE по переданной строке и выдавала в браузер куски исходного кода с номерами строк. По факту — готовый инструмент для выкачивания чужих конфигов и поиска паролей.
2.3. Рекурсивное удаление файлов (tetha.php, функция Wd_)
Очистка кеша реализована через рекурсивный обход scandir() + unlink(). Если подсунуть туда манипулированный путь (или если в переменной будет пустота / корень), скрипт сносит все подряд без проверки, находится ли папка внутри DIR_CACHE.
2.4. Удаленная инъекция через iframe (RFI / Remote JS Execution)
В tetha.php экран настроек подгружался по ссылке:
Это огромная дыра: автор модуля со своего сервера мог в любой момент отдать любой JS-код, который выполнялся в браузере залогиненного администратора (с полным доступом к админке, токенам, заказам и созданию пользователей).
====================================================================
3. ВЫПОЛНЕНИЕ СИСТЕМНЫХ КОМАНД (RCE / Server Reconnaissance)
====================================================================
В special.php (функции Wlc и Wld):
$Maaz = @popen("ps axuewwww", "rb");
$output = stream_get_contents($Maaz);
$Maaz = @popen("top -b -n 1", "rb");
Модуль дергал консольные утилиты Linux:
- ps axuewwww выводит вообще все запущенные на сервере процессы, включая аргументы запуска (где часто висят пароли к MySQL, крон-задачи и пути других пользователей на сервере).
- top парсил системную нагрузку и PID.
Для модуля кеширования OpenCart это абсолютно недопустимые системные вызовы.
====================================================================
4. УТЕЧКИ ЧУВСТВИТЕЛЬНЫХ ДАННЫХ И СЛИВЫ
====================================================================
4.1. Дамп всего $_SERVER (zero.php, маршрут li_op=s)
При обращении тупо вываливал весь массив $_SERVER на экран: логин/пароль к базе данных (DB_PASSWORD), системные пути, хосты, параметры веб-сервера.
4.2. Слив таблицы oc_setting (zero.php, маршрут li_op=tools&tool=setting)
Запрос делал прямой SELECT * FROM oc_setting и выкатывал в браузер всю таблицу настроек магазина: ключи платежек, API-ключи Новой Почты, доступы мерчантов и т.д.
4.3. Слив IP-адресов клиентов наружу (special.php, контроль доступа)
В логике контроля доступа IP-адреса посетителей магазина и параметры слались на внешние сервисы (parsemx.com, ip-api.com, bukrek.net) для гео-анализа и пробива провайдеров.
4.4. Телеметрия автора
При каждой проверке лицензии наружу на devs.mx улетал домен, версия OpenCart, IP сервера и текущие токены.
====================================================================
5. КОСЯКИ С СЕССИЯМИ (почему выкидывало из админки)
====================================================================
5.1. Блокировка сохранения сессий в beta.php (функция Wni)
Модуль перехватывал метод Session\DB::write() и если данные сессии не изменились, возвращал true и НЕ обновлял поле expire в таблице oc_session. В итоге через некоторое время сессия админа считалась протухшей, база ее удаляла, и админа выкидывало с ошибкой "Неправильная токен-сессия".
5.2. Затирание сессии админа в zero.php (функция Wnj)
Фоновые AJAX-запросы виджета могли триггерить REPLACE INTO oc_session с данными без user_id/user_token, сбивая авторизацию.
====================================================================
6. НЕБЕЗОПАСНАЯ ДЕСЕРИАЛИЗАЦИЯ
====================================================================
По всему коду разбросаны вызовы unserialize() над файлами из кеша без параметра ['allowed_classes' => false]. Если бы в кеш-файл попала модифицированная строка, это привело бы к выполнению деструкторов произвольных классов (PHP Object Injection).
====================================================================
ЧТО БЫЛО СДЕЛАНО И ИСПРАВЛЕНО:
====================================================================
1. Полностью отрезали все внешние запросы к devs.mx, parsemx, bukrek и др. Модуль больше никуда наружу не стучится.
2. Сделали полностью локальную страницу настроек на чистом PHP/HTML (li_op=settings), настройки теперь сохраняются в локальный конфиг storage/cache/lightning/core/b без всяких удаленных фреймов.
3. Закрыли дыру с дампом $_SERVER: все секретные поля (pass, key, secret, token, auth, pwd, db) маскируются звездочками.
4. Починили обработчик сессий в beta.php и zero.php: сессии админа больше никогда не сбрасываются и не затираются фоновыми процессами.
5. Убрали опасные вызовы popen с ps/top.
6. Ограничили файловые операции только папками кеша сайта (DIR_CACHE).
7. Защитили прямой доступ к системным инструментам проверкой ключа и токена админа.
8. Убрали все авторские "капканы" и проверки User-Agent/HTTP_X_REQUESTED_WITH, из-за которых модуль раньше падал при работе через Cloudflare.
П.С.
Прежде покупать это Г**** подумайте 100 раз, модуль и 1 бакса не стоит с такими дырами и закладками от недоафтара