Введение
Добрый день, уважаемые подписчики! Сегодня мы разберем одну старую уязвимость в плагине Discount Rules for WooCommerce < 2.2.0 для WordPress.
WooCommerce - это плагин для создания онлайн-магазина на движке WordPress, а WooCommerce Discout Rules - дополнение для WooCommerсe для предоставления и управления скидками на товары.
Суть уязвимости заключается в возможности использовать некоторые методы плагина через admin-ajax.php, которые позволяют перечислять товары, пользователей, а самое главное - сделать товар бесплатным посредством добавления правила на скидку.
Данная статья представлена исключительно в образовательных целях. Red Team сообщество "GISCYBERTEAM" не несёт ответственности за любые последствия ее использования третьими лицами.
Стенд
Для стенда были использованы:
WordPress последней версии (https://ru.wordpress.org/download/).
WooCommerce последней версии (можно поставить через админку WP).
Discount Rules for WooCommerce версии 2.0.1 (https://pluginarchive.com/wordpress/woo-discount-rules/v/2-0-1).
Обзор уязвимости
Все методы, доступные неаутентифицированному пользователю можно найти в исходном коде плагина в файле wp-content/plugins/woo-discount-rules/v2/App/Controllers/Admin/WDRAjax.php, но мы обратим внимание только на один, который позволит нам добавить скидку на товары.
![](https://habrastorage.org/getpro/habr/upload_files/00d/a21/a3a/00da21a3a5aba289c96805ba6c7b68e3.png)
Но прежде всего, нам необходимо удостовериться в том, что текущая кодовая база соответствует необходимой. Дело в том, что в этом плагине есть все версии кода - v1 и v2. Нас интересует именно вторая версия. Для того, чтобы проверить, можно послать следующий запрос, на вывод всех зарегистрированных пользователей.
![](https://habrastorage.org/getpro/habr/upload_files/422/ad3/b49/422ad3b4954bb5779834ce0988732da6.png)
Если мы видим такой ответ, значит нам нужно сменить базу на вторую версию, отправив GET-запрос на любой дестинейшн с параметром awdr_switch_plugin_to=v2.
![](https://habrastorage.org/getpro/habr/upload_files/2e8/845/528/2e8845528d7d2cd064ef1d8cf12945e4.png)
После этого, у нас все должно заработать.
![](https://habrastorage.org/getpro/habr/upload_files/a1e/9fe/a2a/a1e9fea2aeac1dfaf85b7284526ca410.png)
Вернемся обратно к функции wdr_ajax_save_rule из файла WDRAjax.php (первый скриншот). Мы видим, что при сохранении правила создается объект класса Rule. Посмотрим какие свойства он содержит.
![](https://habrastorage.org/getpro/habr/upload_files/d7a/69f/c07/d7a69fc0749b0588136729ab5667d715.png)
Разберем только самые необходимые:
title - название скидочного правила.
enabled- включено/выключено правило.
discount_type - тип скидки (wdr_simple_discount - скидка на товар отображается на главной странице, wdr_cart_discount - скидка отображается в корзине, wdr_bulk_discount - скидка с более гибкой настройкой, где можно выбрать минимальную и максимальную стоимость товара). Эти типы скидок можно также увидеть в админке при добавлении.
![](https://habrastorage.org/getpro/habr/upload_files/6db/d2a/b23/6dbd2ab23a289af733f40b45a0a6c3b1.png)
filters - фильтр товаров, для которых будет добавлена скидка.
cart_adjustments - вид скидки (фиксированная или в процентах) и его значение.
Теперь, зная необходимые параметры, можем отправить запрос на создание скидки.
![](https://habrastorage.org/getpro/habr/upload_files/40b/fa2/3a3/40bfa23a3503246981ab0023c27073be.png)
После этого в админке должна появиться созданная скидка.
![](https://habrastorage.org/getpro/habr/upload_files/7b8/d18/a56/7b8d18a561a933fa32c9a77cd26a8178.png)
Теперь, если мы зайдем на главную страницу, то увидим следующую картину:
![](https://habrastorage.org/getpro/habr/upload_files/556/44a/855/55644a855fe948b15dae7eb607e1d2a1.png)
Заключение
В этой статье мы рассмотрели уязвимость в плагине Discount Rules for WooCommerce, которая позволяет любому неаутентифицированному пользователю управлять скидками в магазине, что позволяет бесплатно приобретать товары.
Подписывайтесь на наш Telegram-канал https://t.me/giscyberteam