Icex0/wp2shell-poc

GitHub: Icex0/wp2shell-poc

针对 WordPress 核心 REST API 路由混淆导致的未授权 SQL 注入漏洞(CVE-2026-63030)的 PoC 工具,支持从盲注验证到数据库读取及远程代码执行的完整利用链。

Stars: 426 | Forks: 101

# wp2shell-poc 这是一个针对 WordPress 核心未授权 SQL 注入的概念验证,该漏洞通过 REST batch 路由混淆 (CVE-2026-63030) 实现链式远程代码执行。 该漏洞利用无需任何凭证,除了需要目标可访问外,无需任何额外配置。它通过单个端点触发注入:`POST /wp-json/batch/v1`。 漏洞发现本身是一个未授权的 SQL 注入 —— `check` 命令用于确认漏洞,而 `read` 命令用于演示任意数据库读取。`shell` 命令是可选的漏洞利用后操作(恢复管理员凭证 → 上传插件 → 执行命令),包含它是为了展示其完整影响;它本身不属于该漏洞。 ## 受影响版本 | 分支 | 受影响版本 | 修复版本 | | ------ | -------------- | -------- | | 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.9.0 之前的版本不受此攻击链的影响。 ## 工作原理 REST batch 端点 (`/batch/v1`) 无需认证,并且它会在一次调用中执行多个子请求,依赖于每个子请求各自进行验证和权限检查。 `serve_batch_request_v1()` 构建了两个平行的数组 —— `$matches`(每个子请求匹配的 handler)和 `$validation`(每个子请求的验证结果)—— 然后在调度时使用相同的偏移量对两者进行索引。如果一个子请求的路径未通过 `wp_parse_url()` 验证,它会被追加到 `$validation` 但不会追加到 `$matches` 中,因此这两个数组会错位,导致某个子请求在**另一个不同**子请求的 handler 下被调度。这就是路由混淆。 该 PoC 对此原语进行了两次嵌套: 1. 一个带有 `requests` body 的 `POST /wp/v2/posts` 请求在 batch handler 自身下被调度。由于它已经被当作一个 posts 请求进行了验证,其 `requests` 列表永远不会根据 batch schema 进行检查,因此其子请求可以使用 `GET` 方法 —— 从而绕过了方法白名单。 2. 在那个内部 batch 中,一个带有 `author_exclude` 字符串的 `GET /wp/v2/users` 请求(users schema 没有此类参数,因此该值在验证过程中原封不动地通过)在 posts 的 `get_items()` 下被调度。在那里,`author_exclude` 映射到 `WP_Query` 的 `author__not_in` 查询变量,而易受攻击的构建版本会将其作为字符串插入到 SQL 中。 这导致了一个在身份验证前即可触发的布尔盲注和时间盲注 SQL 注入。拥有数据库读取权限后,可以恢复管理员密码的哈希值;一旦破解,管理员权限即可通过上传插件实现代码执行。 ## 环境要求 Python 3.8+ 及标准库。无第三方依赖。 ## 用法 在仓库目录中运行: ``` ./wp2shell.py [options] ``` 或者执行 `pip install .` 将 `wp2shell` 命令安装到您的 `PATH` 中。 ### check — 确认漏洞(安全) 通过差异化时间延迟确认可利用性。它不读取任何数据,也不会进行任何更改。 ``` ./wp2shell.py check http://target ``` ### read — 提取数据(盲注 SQL 注入) ``` ./wp2shell.py read http://target # server fingerprint ./wp2shell.py read http://target --preset users # user logins and password hashes ./wp2shell.py read http://target --query "SELECT @@version" ``` ### shell — 执行命令(远程代码执行) 可选的漏洞利用后操作。需要有效的管理员凭证;由于注入恢复的是密码*哈希值*,因此请在此处提供恢复的明文密码。 ``` ./wp2shell.py shell http://target --user admin --password '' --cmd id ./wp2shell.py shell http://target --user admin --password '' -i # interactive shell ``` `shell` 会上传一个插件 webshell(通过随机路径和每次运行的 token 锁定)并打印其路径。完成后请将其删除。 ## 选项 | 选项 | 应用于 | 描述 | | ------------------- | ---------- | -------------------------------------------------------------------- | | `--rest-route` | all | 使用 `/?rest_route=/batch/v1`(适用于未启用固定链接的站点)。 | | `--proxy URL` | all | 通过 HTTP 代理路由流量(例如 Burp)。 | | `--timeout N` | all | 请求超时时间(秒)。 | | `--sleep N` | check | 用于确认注入的延迟时间。 | | `--preset` | read | `fingerprint` 或 `users`。 | | `--query` | read | 要读取的标量 SQL 表达式。 | | `--prefix` | read | 数据库表前缀(默认为 `wp_`)。 | | `--max-length N` | read | 每个值读取的最大字符数(默认 128)。 | | `--user` / `--password` | shell | 管理员凭证(从哈希恢复的明文)。 | | `--cmd` | shell | 要运行的命令(使用 `-i` 时省略)。 | | `-i` / `--interactive` | shell | 部署后打开交互式 shell。 | ## 修复建议 更新至 WordPress 6.9.5 或 7.0.2。在此之前,请在边缘节点屏蔽 `/wp-json/batch/v1` 和 `rest_route=/batch/v1` 查询参数,或者通过 `rest_pre_dispatch` 过滤器要求对 batch 端点进行身份验证。 ## 法律声明 仅供授权的安全测试使用。仅限在您拥有或获得明确书面许可进行测试的系统上使用。作者对任何滥用行为不承担责任。 ## 参考 - WordPress 7.0.2 版本发布公告 — - CVE-2026-63030
标签:CISA项目, PoC, RCE, Web安全, WordPress, XXE攻击, 暴力破解, 蓝队分析, 逆向工具