Екатеринбург

Исправление SQL-инъекции в miniShop2 (MODX) — решение проблемы в msOrderHandler

Исправление SQL-инъекции в miniShop2 (MODX) — решение проблемы в msOrderHandler

Если ваш сервер на MODX внезапно начал "тормозить", а в списке процессов MariaDB появились тяжелые запросы к таблице msPayment с использованием information_schema и 0 XOR 1, скорее всего, вы столкнулись с активной SQL-инъекцией через компонент miniShop2.

Описание проблемы

Уязвимость кроется в способе обработки выбора оплаты для конкретной доставки. В некоторых версиях miniShop2 (включая ветку 3.x) переменная идентификатора доставки подставляется в SQL-запрос напрямую, что позволяет злоумышленникам выполнять "слепую" SQL-инъекцию (Blind SQL Injection).

Это приводит к 100% нагрузке на CPU и может полностью парализовать работу базы данных MySQL/MariaDB.

Как исправить: пошаговый патч

Для устранения дыры необходимо принудительно привести входящие данные к числовому типу в системном файле компонента.

  1. Найдите файл по адресу: /core/components/minishop2/handlers/msorderhandler.class.php
  2. Найдите метод hasPayment($delivery, $payment).
  3. Измените строку формирования запроса, добавив (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.

Защита сервера — это процесс, а не разовое действие. Следите за логами и вовремя закрывайте уязвимости!

Легко сделаем вам сайт

Напишите нам - мы любим общаться!