
Python 3 PoC-сканер и эксплойт для CVE-2026-92229 — уязвимости неаутентифицированного выполнения произвольных шорткодов в плагине WordPress Forminator версий 1.57.2 и ниже.
Python 3 PoC-сканер/эксплойт для CVE-2026-92229 в Forminator (WPMU DEV).
| Плагин | forminator |
| Затронуты | ≤ 1.57.2 |
| Исправлено в | 1.57.3+ |
| CVSS | 9.1 (Критический) |
| Аутентификация | Не требуется |
| Вектор | POST-параметр current_url (AJAX викторины) |
| CWE | CWE-94 (Внедрение кода) |
| Автор | Kuba (Wordfence) |
В уязвимых версиях предоставленный пользователем current_url отражается в HTML-результате викторины (например, в атрибутах кнопок «поделиться») и буфер ответа обрабатывается функцией WordPress do_shortcode(). Неаутентифицированный злоумышленник может отправить викторину через admin-ajax.php с вредоносным current_url, содержащим произвольные шорткоды.
Основные AJAX-действия:
forminator_submit_form_quizzesforminator_submit_preview_form_quizzes (предпросмотр; --preview)Исправлено в 1.57.3 путём ограничения выполнения шорткодов только предназначенными текстовыми полями вместо всего HTML-буфера.
pip install -r requirements.txtpip install -r requirements.txt
# Detect plugin, version, public Forminator modules (quiz answers when parseable)
python poc.py -u https://target.example --mode check
# Mass check
python poc.py --list targets.example.txt --mode check --threads 30 --quiet
# Exploit (auto nonce + quiz answers when possible)
python poc.py -u https://target.example --mode exploit \
--page-url /quiz/ --form-id 42 \
--shortcode "PROBE"
# Preview submit (no stored entry, same code path)
python poc.py -u https://target.example --mode exploit --preview \
--page-url /quiz/ --form-id 42
# Manual quiz answers if HTML parsing fails
python poc.py -u https://target.example --mode exploit \
--form-id 42 --answers "2051:7608,2052:7610"
| Параметр | Описание |
|---|---|
-u, --url | Базовый URL одной цели |
--list | Файл с одним URL на строку |
--mode | check (по умолчанию) или exploit |
--page-url | Путь или URL страницы, содержащей форму |
--form-id | ID модуля Forminator |
--form-type | quizzes, custom-forms или poll |
--answers | Ответы викторины в формате question_id:answer_id,... |
--shortcode | Полезная нагрузка шорткода (оборачивается в [caption]…[/caption] внутри current_url) |
--preview | Использовать AJAX-действие предпросмотра |
--threads, -j | Параллелизм массового сканирования (по умолчанию 20) |
--output | Результаты в JSONL (по умолчанию cve_2026_92229_results.jsonl) |
--vuln-list | Текстовый файл для найденных уязвимостей (по умолчанию hits.txt) |
--candidates-list | JSONL-метаданные для эксплуатируемых проверок (по умолчанию candidates.jsonl) |
--quiet | Меньше вывода о ходе выполнения при массовых запусках |
| Файл | Содержимое |
|---|---|
cve_2026_92229_results.jsonl | JSON по каждой цели (status, version, modules, …) |
hits.txt | Базовые URL с exploitable_candidate: true |
candidates.jsonl | Детали попаданий: form_id, page_url, form_type |
status| Статус | Значение |
|---|---|
candidate | Уязвимая версия + викторина с разобранными ответами |
form_no_quiz_answers | Форма найдена, но ответы викторины не разобраны автоматически |
plugin_no_public_form | Плагин присутствует, публичный модуль не обнаружен |
patched | Версия ≥ 1.57.3 (или более новая мажорная) |
no_plugin | Forminator не обнаружен |
exploitable_candidate только когда answers[qid] викторины может быть разобран из HTML (многие сайты используют викторины, отрисовываемые через JS → используйте --answers или ручной эксплойт).[caption])..
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Локальные списки для массового сканирования (например, list.txt, выгрузки FOFA, результаты *.jsonl) перечислены в .gitignore и не должны коммититься.
Только для авторизованного тестирования безопасности. Вы несёте ответственность за соблюдение применимых законов и правил программ.