WordPress Time-based blind SQL injection в Business Directory Plugin для (CVE-2024-4443)
Введение
Business Directory Plugin — это инструмент для создания онлайн-каталогов бизнеса на сайтах, работающих на WordPress
. Он позволяет пользователям добавлять, редактировать и управлять списками компаний, а также предоставляет функции для поиска, фильтрации и сортировки. Плагин часто включает опции для отображения отзывов, карт и интеграции с платежными системами, что делает его полезным для создания местных бизнес-каталогов, справочников и порталов. По информации из магазина плагинов WordPress Business Directory Plugin
установлен более, чем на 10000 сайтах.
22 мая 2024 года была опубликована критическая уязвимость CVE-2024-4443
, которая затрагивает все версии Business Directory Plugin
ниже 6.4.3. Уязвимость имеет CVSS
рейтинг в 9.8 баллов и не требует аутентификации пользователя.
Данная статья представлена исключительно в образовательных целях. Red Team сообщество "GISCYBERTEAM" не несёт ответственности за любые последствия ее использования третьими лицами.
Описание уязвимости
Плагин Business Directory Plugin
для WordPress
уязвим к time-based SQL
-инъекциям через параметр listingfields
во всех версиях до 6.4.2 включительно. Уязвимость обусловлена недостаточным экранированием входных данных и отсутствием адекватной подготовки SQL
-запросов.
Что такое SQL инъекция
SQL-инъекция — это тип уязвимости в веб-приложениях, позволяющий злоумышленникам вставлять произвольные SQL
-запросы в поля ввода, что может привести к несанкционированному доступу к данным, их изменению или удалению.
Time-based SQL-инъекция — это специфический вид SQL
-инъекции, при котором злоумышленник использует задержки в ответах базы данных для извлечения информации. Злоумышленник формирует запросы, которые заставляют базу данных ждать определенное время перед ответом, что позволяет определить, существует ли тот или иной элемент данных, основываясь на времени задержки.
Подготовка стендового окружения
Для работы WordPress
необходимо установить веб-сервер с поддержкой PHP
, а также поднять MySQL
. В качестве тестового окружения будет использоваться XAMPP.
Установка WordPress
Заходим на страницу загрузки WordPress и скачиваем последнюю версию:
Теперь нужно разархивировать WordPress
и перенести его в корневой каталог веб-сервера (для XAMPP
- /opt/lampp/htdocs
):
cd ~/Downloads unzip wordpress-6.6.2.zip sudo mv wordpress /opt/lampp/htdocs/
Также нужно изменить владельца папки wordpress
на пользователя веб-сервера (в случае с XAMPP
- daemon
):
sudo chown -R daemon:daemon /opt/lampp/htdocs
Дальнейшая установка происходит в GUI WordPress
. Чтобы перейти к нему в браузере заходим на http://127.0.0.1/wordpress:
Здесь необходимо будет указать данные для подключения к MySQL
(для XAMPP
- имя пользователя root
и пустой пароль), а также создать админского пользователя:
WordPress
установлен, перейдём к установке уявзимого плагина.
Установка Business Directory Plugin
Скачать уязвимую версию плагина можно на странице магазина плагинов WordPress
:
После этого в админской панели WordPress
необходимо установить плагин:
После активации плагин попросит разрешение на автоматическое создание страницы для себя и станет доступен по адресу http://127.0.0.1/wordpress/business-directory.
Разбор уязвимости
Уязвимым компонентом плагина является форма поиска, а именно GET
параметр listingfields[SQL INJECTABLE][1]=
. Так как результаты инъекции не отражаются непосредственно на содержимом страницы можно использовать time-based нагрузку для эксплуатации уязвимости. Результат запроса с sleep(0)
(тоесть без задержки):
Результат с задержкой равной 10 секундам (sleep(10)
):
Для демонстрации возможности извлечения данных попробуем узнать в какой базе данных мы сейчас находимся. Для этого используем следующий пэйлоад:
)) or if(substring(database(),1,1)='a',sleep(5),'a')#
Здесь функция database()
возвращает название текущей базы данных, затем из него с помощью функции substring()
извлекается первый символ и сравнивается с буквой a
. Если условие выполняется, то вызывается функция sleep(5)
, которая засталвяет MySQL
подождать 5 секунд. Добавим нагрузку в Intruder
Burp Suite
:
В первом наборе данных будут представлены числа от 1 до 20, из которых будут извлекаться 1-й, 2-й и последующие символы названия базы данных. Во втором наборе будут подставляться соответствующие буквы. Запустим перебор, сортируя вывод по времени ответа:
Вывод
В результате эксплуатации уязвимости было получено имя базы данных, что может быть расширено до несанкционированного доступа к чувствительным данным, таким как хэши и логины пользователей в таблицах. Уязвимость имеет рейтинг CVSS 9.8 и классифицируется как критическая. Пользователям рекомендуется обновить плагин до версии не ниже 6.4.3.