
Аутентифицированный PoC для CVE-2026-0911: проверяет слабую загрузку файлов и поведение с осиротевшими файлами в конечной точке импорта модулей плагина WordPress Hustle, с многоцелевым сканированием и настройкой полезной нагрузки.
Инструмент исследования / вспомогательный инструмент для пентеста, который тестирует поведение загрузки через требующую аутентификации конечную точку импорта модуля в рамках CVE-2026-0911 для плагина WordPress Hustle (wordpress-popup, WPMU DEV).
Скрипт CVE-2026-0911.py из этого репозитория или набора файлов должен использоваться только на системах, которыми вы владеете или тестируете с письменного разрешения.
В затронутых версиях (Wordfence/NVD: 7.8.9.2 и более ранние) вызов wp_handle_upload() внутри action_import_module() выполняется с параметром test_type => false, из-за чего проверка типа файла остаётся слабой; даже если проверка JSON после импорта завершается неудачей, загруженный файл может не быть удалён («осиротевший» файл). Если сервер выполняет PHP в wp-content/uploads, это может стать частью цепочки, ведущей к удалённому выполнению кода на практике. В исправленных версиях используется test_type => true и временное ограничение .json через upload_mimes.
Подробное техническое описание см. в записи NVD и ссылках Wordfence.
from __future__ import annotations)Пример установки:
pip install requests
Обязательны как минимум одна цель (-u или -l) и действующая сессия WordPress (--cookie или --cookie-file).
python CVE-2026-0911.py -u "https://example.com" --cookie "wordpress_logged_in_...=...; ..."
Справка:
python CVE-2026-0911.py --help
| Параметр | Описание |
|---|---|
-u, --url | Корневой URL одной цели (напр. https://site.com) |
-l, --list | Файл с одним URL на строку (комментарии через #) |
--cookie | Строка cookie, скопированная из браузера |
--cookie-file | Файл, содержащий cookie в одной строке |
--nonce | Ручной nonce WordPress для hustle_single_action (вместо автоматического получения) |
--admin-page | Значение admin.php?page=, из которого будет извлекаться nonce (по умолчанию: hustle_popup_listing) |
--module-id | POST moduleId (по умолчанию 0: недействительный модуль → поток импорта) |
--module-type | popup, slidein, embedded, social_sharing |
--module-mode | Напр. informational, optin |
--remote-name | Имя файла, отправляемого в multipart (по умолчанию: probe_rce.php) |
--payload-file | Читать загружаемое содержимое из файла (переопределяет --uploader и пробу по умолчанию) |
--uploader | Использовать встроенное мини-тело PHP form-uploader |
--workers | Количество одновременных потоков в режиме списка (по умолчанию: 8) |
--timeout | Таймаут запроса в секундах (по умолчанию: 25) |
--verify-ssl | Включить проверку TLS (по умолчанию: выключена) |
--debug | Дополнительный вывод отладки |
--quiet | Отключить логи доменов/шагов; ориентир на сводку |
-o, --output | Файл, в который добавляются строки успешных «попаданий» |
admin-ajax.php, возможные URL-кандидаты. При нескольких целях строки могут выглядеть перемешанными, так как поступают из потоков; каждая строка содержит домен цели.--quiet эти подробности подавляются.append) в файл -o и записываются на диск с flush / по возможности fsync. Имя файла по умолчанию: cve-2026-0911-hits.txt (в рабочем каталоге выводится абсолютный путь).Один сайт, проверка TLS, отладка:
python CVE-2026-0911.py -u "https://lab.local" --cookie-file cookie.txt --verify-ssl --debug
Сканирование списка, 16 рабочих потоков, пользовательский вывод:
python CVE-2026-0911.py -l targets.txt --cookie "..." --workers 16 -o results.txt
Встроенное тело uploader и пользовательское удалённое имя файла:
python CVE-2026-0911.py -u "https://lab.local" --cookie "..." --uploader --remote-name test.php
single_module_action_nonce внутри optinVars.moduleId=0 плагин может вернуть ошибку из-за лимита модулей перед загрузкой; в этом случае файл не записывается.wp-content/uploads/YYYY/MM/; если WordPress переименует файл, фактический путь может отличаться.--cookie не работает для разных доменов; при тестировании нескольких сайтов для каждого окружения требуется соответствующая сессия.0, иначе ненулевой код (возврат main внутри скрипта).Ctrl+C: 130.Этот инструмент предназначен только для легального тестирования безопасности, обучения и целей защиты. Использование на несанкционированных системах противозаконно и может повлечь серьёзные наказания. Авторы и участники не несут ответственности за злоупотребление.