Если ваш сервер на MODX внезапно начал "тормозить", а в списке процессов MariaDB появились тяжелые запросы к таблице msPayment с использованием information_schema и 0 XOR 1, скорее всего, вы столкнулись с активной SQL-инъекцией через компонент miniShop2.
Описание проблемы
Уязвимость кроется в способе обработки выбора оплаты для конкретной доставки. В некоторых версиях miniShop2 (включая ветку 3.x) переменная идентификатора доставки подставляется в SQL-запрос напрямую, что позволяет злоумышленникам выполнять "слепую" SQL-инъекцию (Blind SQL Injection).
Это приводит к 100% нагрузке на CPU и может полностью парализовать работу базы данных MySQL/MariaDB.
Как исправить: пошаговый патч
Для устранения дыры необходимо принудительно привести входящие данные к числовому типу в системном файле компонента.
- Найдите файл по адресу:
/core/components/minishop2/handlers/msorderhandler.class.php - Найдите метод
hasPayment($delivery, $payment). - Измените строку формирования запроса, добавив (int) перед переменной
$delivery.
// Было:
'Member.payment_id = msPayment.id AND Member.delivery_id = ' . $delivery
// Должно стать:
'Member.payment_id = msPayment.id AND Member.delivery_id = ' . (int)$delivery
После внесения правок обязательно очистите кэш MODX.
Дополнительная защита (PHP Filter)
В качестве "первой линии обороны" рекомендуется добавить в начало основного файла index.php вашего сайта фильтр, который будет блокировать запросы с типичными признаками SQL-инъекции:
if (!empty($_REQUEST)) {
$danger = ["information_schema", "select count", "0 xor 1", "cast(", "ifnull("];
foreach ($_REQUEST as $val) {
if (is_string($val) && strpos(strtolower($val), "information_schema") !== false) {
header("HTTP/1.1 403 Forbidden");
exit("Security Blocked.");
}
}
}
Рекомендации на будущее
- Регулярные обновления: Всегда обновляйте miniShop2 и MODX до последних версий.
- Типизация данных: При написании собственных сниппетов всегда используйте приведение типов, например
(int)$id. - Мониторинг: Настройте уведомления о высокой нагрузке на MySQL. Это позволит заметить атаку на ранней стадии.
- WAF: Используйте защитные экраны на уровне веб-сервера (ModSecurity) или сервисы вроде Cloudflare.
Защита сервера — это процесс, а не разовое действие. Следите за логами и вовремя закрывайте уязвимости!