
Плагин WordPress PPOM for WooCommerce версии <= 33.0.15 уязвим к SQL-инъекциям.
Этот репозиторий содержит Proof of Concept (PoC) для неаутентифицированной time-based blind SQL-инъекции в WordPress-плагине "PPOM for WooCommerce", затрагивающей версии вплоть до 33.0.15 включительно.
Уязвимость существует из-за того, что плагин не выполняет надлежащую санитизацию пользовательского ввода перед использованием его в SQL-запросе. В частности, функция get_product_meta() в classes/plugin.class.php напрямую конкатенирует параметр $meta_id в SQL-запрос без использования подготовленных выражений.
Уязвимый код (classes/plugin.class.php):
function get_product_meta( $meta_id ) {
// ...
global $wpdb;
$qry = 'SELECT * FROM ' . $wpdb->prefix . PPOM_TABLE_META . " WHERE productmeta_id = $meta_id";
$res = $wpdb->get_row( $qry );
return $res;
}
Неаутентифицированный злоумышленник может воспользоваться этой уязвимостью, создав вредоносную полезную нагрузку и внедрив её в параметр ppom[fields][id] при добавлении товара в корзину. Это позволяет злоумышленнику выполнять произвольные SQL-команды, такие как функции задержки времени (SLEEP()), что даёт возможность подтвердить наличие уязвимости и потенциально извлечь конфиденциальную информацию из базы данных посимвольно.
Уязвимость срабатывает, когда в настройках плагина активна опция "Enable Legacy Price Calculations", поскольку это заставляет приложение использовать уязвимый путь выполнения кода во время операций с корзиной.
└── cve-2025-11391/
├── exploit.py # Python-скрипт Proof of Concept.
└── woocommerce-product-addon/ # Уязвимая версия плагина (v33.0.15).
requests (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15), предоставленную в этом репозитории, загрузив .zip-файл из каталога woocommerce-product-addon/.sql_injection).Предоставленный скрипт exploit.py подтверждает уязвимость, внедряя команду SLEEP() и измеряя время ответа сервера.
Откройте файл exploit.py и настройте следующие переменные:
PRODUCT_URL: полный URL-адрес страницы уязвимого товара, который вы создали.add_to_cart_data['add-to-cart']: ID вашего уязвимого товара.Запустите скрипт из терминала:
python exploit.py
Если цель уязвима, сервер будет отвечать дольше, чем длительность SLEEP(), что приведёт к тайм-ауту скрипта. Скрипт корректно интерпретирует этот тайм-аут как успешную эксплуатацию.
Attempting SQL Injection PoC (One-Step Method)...
Make sure 'Enable Legacy Price Calculations' is active.
[*] Sending SQL Injection payload...
Request timed out after 10.00 seconds.
[+] SUCCESS! 'Read timed out' occurred because the SLEEP(7) payload was executed.
The site is vulnerable to Time-Based Blind SQL Injection.
$wpdb->prepare() для надлежащей санитизации ввода, что предотвращает SQL-инъекцию.Исправленный код (classes/plugin.class.php):
$table = $wpdb->prefix . PPOM_TABLE_META;
$res = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE productmeta_id = %d", $meta_id ) );
Данный PoC предназначен исключительно для образовательных и исследовательских целей. Не используйте его на каких-либо системах, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Автор не несёт ответственности за любое неправомерное использование или ущерб, причинённый данным скриптом.