
Python PoC-сканер и эксплойт для CVE-2026-84434 — неаутентифицированной загрузки произвольных файлов в Gravity Forms <=3.1.0.4 через скрытые поля File Upload. Поддерживает режимы проверки, эксплуатации и массового сканирования.
Сканер и эксплойт PoC на Python 3 для CVE-2026-84434 в Gravity Forms.
| Плагин | gravityforms |
| Уязвимые версии | ≤ 3.1.0.4 |
| Исправлено в | 3.1.0.5+ (релиз безопасности от вендора 3.1.1) |
| CVSS | 9.8 (Критический) |
| Аутентификация | Не требуется |
| CWE | CWE-434 — Неограниченная загрузка |
| Автор | 0xd4rk5id3 — EnvoraSec (Wordfence) |
Скрытые поля File Upload пропускают проверку расширения в конвейере валидации, при этом путь сохранения может по-прежнему вызывать upload_file() без эквивалентных проверок. Неаутентифицированный злоумышленник может отправить POST-запрос к публичной форме, содержащей поле File Upload со значением Visibility → Hidden.
Файлы сохраняются в wp-content/uploads/gravity_forms/. Gravity Forms обычно добавляет правила .htaccess для блокировки выполнения PHP; RCE зависит от конфигурации сервера (nginx, альтернативный docroot и т. д.).
gform_wrapper и скрытого поля fileupload (input_{form}_{field})gform_submit, is_submit_{id}, файл в скрытом поле)pip install -r requirements.txtpip install -r requirements.txt
# Check single target
python poc.py -u https://target.example --mode check
# Mass check
python poc.py --list targets.example.txt --mode check --threads 30 --quiet
# Exploit (built-in benign .txt probe unless --payload-file is set)
python poc.py -u https://target.example --mode exploit \
--form-id 3 --page-url /contact/ --file-field 7
# Custom upload file (your own probe — not included in this repo)
python poc.py -u https://target.example --mode exploit \
--form-id 3 --page-url /contact/ --file-field 7 \
--payload-file probe.txt
# Mass exploit from check output
python poc.py --list candidates.jsonl --mode exploit --threads 10 --quiet
| Опция | Описание |
|---|---|
-u, --url | Базовый URL одной цели |
--list | Список URL, CSV в стиле FOFA или candidates.jsonl |
--mode | check (по умолчанию) или exploit |
--form-id | ID формы Gravity Forms |
--page-url | Путь или URL страницы, содержащей форму |
--file-field | ID скрытого поля загрузки файла |
--payload-file | Локальный файл для загрузки (по умолчанию: безвредный .txt-маркер в памяти) |
--paths | Дополнительные пути для обхода в поисках форм |
--threads, -j | Параллелизм при массовой проверке (по умолчанию 20) |
--output | Результаты в JSONL (по умолчанию cve_2026_84434_results.jsonl) |
--vuln-list | URL с попаданиями или успешные эксплойты (по умолчанию hits.txt) |
--candidates-list | Метаданные проверки (по умолчанию candidates.jsonl) |
--quiet | Меньше вывода о ходе выполнения при массовых запусках |
| Файл | Содержимое |
|---|---|
cve_2026_84434_results.jsonl | Полный JSON по каждой цели |
hits.txt | Базовые URL кандидатов |
candidates.jsonl | form_id, page_url, file_field / input_name |
status (check)| Статус | Значение |
|---|---|
candidate | Уязвимая версия + скрытая загрузка файла в публичной форме |
forms_no_hidden_upload | Формы найдены, но ни одна не содержит скрытой загрузки файла в HTML |
plugin_no_public_forms | Плагин присутствует, публичная форма не обнаружена |
patched | Версия > 3.1.0.4 |
no_plugin | Gravity Forms не обнаружен |
.
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Локальные списки сканирования и артефакты (list.txt, *.jsonl, пользовательские полезные нагрузки) указаны в .gitignore и не должны коммититься.
Только для авторизованного тестирования безопасности. Вы несёте ответственность за соблюдение применимых законов и правил программ.