CVE-2020-17463
Fuel CMS Fuel CMS
2021-12-10
FUEL CMS 1.4.7 allows SQL Injection via the col parameter to /pages/items, /permissions/items, or /navigation/items.
Технический анализ и план устранения
Суть уязвимости
Злоумышленник может выполнить произвольные SQL-запросы к базе данных, отправляя специально сформированные данные в параметр col в следующих URL:
* /pages/items
* /permissions/items
* /navigation/items
Это позволяет читать, изменять или удалять данные в БД, а в некоторых случаях — получить контроль над сервером.
Как исправить
Основной метод: Обновление FUEL CMS до версии 1.4.8 или выше, где данная уязвимость устранена.
Для систем на базе Debian/Ubuntu:
# 1. Скачайте и распакуйте последнюю версию FUEL CMS с официального сайта или GitHub
wget https://github.com/daylightstudio/FUEL-CMS/archive/refs/tags/1.5.1.zip
unzip 1.5.1.zip
# 2. Создайте резервную копию текущей установки и базы данных
cp -r /var/www/fuel/ /var/www/fuel_backup_$(date +%Y%m%d)/
mysqldump -u [user] -p [fuel_database] > /backup/fuel_db_backup_$(date +%Y%m%d).sql
# 3. Замените файлы ядра CMS (папки `fuel/application/`, `fuel/modules/fuel/`)
# Скопируйте новые файлы из распакованного архива поверх старой установки, сохранив свою конфигурацию (fuel/application/config/)
cp -r FUEL-CMS-1.5.1/fuel/application/ /var/www/fuel/fuel/
cp -r FUEL-CMS-1.5.1/fuel/modules/fuel/ /var/www/fuel/fuel/modules/
# 4. Проверьте и обновите схему БД, если это требуется в релизных заметках новой версии
# 5. Очистите кэш CMS
rm -rf /var/www/fuel/fuel/application/cache/*
Для Windows-сервера: Процесс аналогичен — замените файлы ядра CMS вручную из актуального релиза.
Временное решение
Если немедленное обновление невозможно, примените следующие меры:
-
Настройка WAF (Web Application Firewall):
- В ModSecurity (для Apache) или NAXSI (для Nginx) добавьте правило для блокировки запросов, содержащих в параметре
colSQL-операторы (UNION, SELECT, INSERT,--,',#и т.д.). - Пример базового правила для ModSecurity:
apache SecRule ARGS_GET:"col" "(union|select|insert|update|delete|drop|--|\'|\#)" \ "id:10001,phase:2,deny,status:403,msg:'SQLi Attempt in col parameter'"
- В ModSecurity (для Apache) или NAXSI (для Nginx) добавьте правило для блокировки запросов, содержащих в параметре
-
Ограничение доступа на уровне веб-сервера:
- В конфигурации виртуального хоста Apache (
.htaccessилиhttpd.conf) или Nginx запретите прямой доступ к уязвимым endpoint'ам для всех, кроме доверенных IP-адресов (администраторов). - Пример для Nginx:
nginx location ~ ^/(pages|permissions|navigation)/items { allow 192.168.1.100; # Ваш IP для администрирования allow 10.0.0.0/24; # Ваша доверенная сеть deny all; proxy_pass http://backend; # Или fastcgi_pass, в зависимости от конфигурации }
- В конфигурации виртуального хоста Apache (
-
Экстренный "костыль":
- В контроллерах FUEL CMS, обрабатывающих
/pages/items,/permissions/items,/navigation/items, добавьте проверку параметраcolперед выполнением запроса. Это крайняя мера, так как требует изменения кода ядра CMS. После обновления правки будут перезаписаны. - Найдите файлы контроллеров (например,
fuel/modules/fuel/controllers/) и перед любым использованием$this->input->get('col')добавьте валидацию, например, на соответствие ожидаемому списку допустимых названий столбцов.
- В контроллерах FUEL CMS, обрабатывающих