attackercan/wp2shell-poc2

GitHub: attackercan/wp2shell-poc2

针对 WordPress REST batch 路由混淆漏洞(CVE-2026-63030)的免认证 SQL 注入 PoC 工具,支持漏洞确认、数据读取和远程代码执行。

Stars: 6 | Forks: 4

# wp2shell-poc 这是关于 WordPress 核心未经身份验证的 SQL 注入的 PoC,该漏洞链可实现远程代码执行,利用途径是通过 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` 字符串(users 的 schema 中没有该参数,因此该值未经任何处理即通过了验证)的 `GET /wp/v2/users` 请求被分发到 posts 的 `get_items()` 下。在那里,`author_exclude` 映射到了 `WP_Query` 的 `author__not_in` 查询变量,而易受攻击的构建版本会将其作为字符串插值到 SQL 中。 结果就是一个在身份验证之前即可触发的基于布尔盲注和时间盲注的 SQL 注入。获得数据库读取权限后,即可恢复管理员密码哈希;一旦破解,管理员访问权限便可通过上传插件实现代码执行。 ## 环境要求 Python 3.8+ 及标准库。无第三方依赖。 ## 用法 在 repository 目录下运行: ``` ./wp2shell.py [options] ``` 或者执行 `pip install .` 来在你的 `PATH` 中获取 `wp2shell` 命令。 ### 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` | 所有模式 | 使用 `/?rest_route=/batch/v1`(适用于未开启伪静态固定链接的站点)。 | | `--proxy URL` | 所有模式 | 通过 HTTP 代理转发流量(例如 Burp)。 | | `--timeout N` | 所有模式 | 请求超时时间(秒)。 | | `--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项目, Web安全, WordPress, 数据泄露, 编程工具, 蓝队分析, 远程代码执行