Vulnerability
October 10

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.