Bhanunamikaze/WP2Shell-CVE-2026-63030-POC

GitHub: Bhanunamikaze/WP2Shell-CVE-2026-63030-POC

一款针对 WordPress WP2Shell 漏洞链(CVE-2026-63030 + CVE-2026-60137)的 PoC 检测器与安全验证器,用于非破坏性地指纹识别受影响的安装并确认漏洞行为。

Stars: 0 | Forks: 0

# WP2Shell 检测与验证 PoC [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/downloads/) [![CVE-2026-63030](https://img.shields.io/badge/CVE-2026--63030-critical.svg)](https://nvd.nist.gov/vuln/detail/CVE-2026-63030) [![CVE-2026-60137](https://img.shields.io/badge/CVE-2026--60137-critical.svg)](https://nvd.nist.gov/vuln/detail/CVE-2026-60137) [![安全研究](https://img.shields.io/badge/purpose-authorized%20security%20testing-informational.svg)](#legal-and-ethical-use) WP2Shell 是一个 WordPress Core 漏洞链,它结合了一个预认证的 REST API 批量路由混淆 bug (**CVE-2026-63030**) 和一个 `WP_Query` `author__not_in` SQL 注入原语 (**CVE-2026-60137**)。此代码库 提供了一个 Python 概念验证扫描器和安全验证器,以便防御者可以 指纹识别受影响的 WordPress 安装,在隔离的实验环境中确认易受攻击的行为,并验证修复情况——而无需提取数据 或实现代码执行。 ## 概述 本项目对 WordPress 安装进行指纹识别,并验证与 **WP2Shell** WordPress Core 漏洞链相关的两个漏洞原语: - **CVE-2026-63030** — REST API 批量路由混淆。 - **CVE-2026-60137** — `WP_Query::author__not_in` 的清理不完整,当攻击者控制的输入到达该参数时可能导致 SQL 注入。 当这两个条件同时存在时,未经身份验证的请求可能会通过 WordPress REST API 批量端点到达易受攻击的 SQL 构造逻辑。公开的安全公告将这种组合影响描述为可能导致远程代码执行。 此代码库仅应用于您拥有或明确获得授权进行测试的系统。建议使用绑定到 `127.0.0.1` 的隔离 Docker 或虚拟机实验环境。 ## 安全提示 当前的源文件包含改变状态的功能,包括数据库数据提取尝试、文件写入尝试、身份验证工作流、管理员创建、插件上传和命令执行。 - WordPress 指纹识别。 - 版本评估。 - 本地源代码树版本检查。 - 安全的路由混淆验证。 - 在隔离的实验环境中进行非破坏性的、基于时间的 SQL 注入确认。 - 报告、证据收集和修复。 ## 漏洞总结 ### CVE-2026-63030 — REST API 批量路由混淆 受影响的 WordPress 版本可能会在用于跟踪以下内容的内部数组之间失去一致性: - 已解析的批量请求。 - 匹配的 REST 路由处理器。 - 验证结果。 当格式错误的批量成员被其中一个内部数组接受,但未被另一个接受时,后续的请求可能会与错误的处理器关联。因此,一个请求可能会被作为某一个路由进行验证,但却使用另一个路由的回调来执行。 **安全影响:** - REST 请求/处理器不同步。 - 针对错误的路由 schema 进行验证。 - 意外的嵌套批量执行。 - 预认证即可触达原本受限的代码路径。 - 当与 CVE-2026-60137 结合使用时,可能导致 SQL 注入和进一步的破坏。 ### CVE-2026-60137 — `author__not_in` SQL 注入 受影响的 `WP_Query` 实现在使用 `author__not_in` 构造 SQL `NOT IN (...)` 条件之前,并未对其进行一致的规范化处理。 该参数通常需要一个整数作者 ID 列表。如果标量字符串在未经过预期的 REST schema 验证的情况下到达易受攻击的查询构造逻辑,不安全的 SQL 结构可能会残留在数据库查询中。 **安全影响:** - 盲注 SQL 注入。 - 基于布尔或时间的数据库盲注。 - WordPress 数据库内容的潜在泄露。 - 当与 CVE-2026-63030 组合使用时影响会加剧。 ## 受影响版本 | WordPress 分支 | 受影响情况 | 修复版本 | |---|---:|---:| | 6.8.x | 仅 CVE-2026-60137:6.8.0–6.8.5 | 6.8.6 | | 6.9.x | 两个问题都有:6.9.0–6.9.4 | 6.9.5 | | 7.0.x | 两个问题都有:7.0.0–7.0.1 | 7.0.2 | | 7.1 预发布版本 | Beta 1 受影响 | Beta 2 | | 6.8 之前版本 | 不受这两个 CVE 影响 | N/A | WordPress 于 2026 年 7 月 17 日发布了修复程序,并由于严重性为受影响的安装启用了强制自动更新。 ## 漏洞工作流 ``` Unauthenticated client | v WordPress REST batch endpoint | v Malformed batch member creates request/handler misalignment | v Later request is validated against one route but dispatched using another route's handler | v Scalar author_exclude reaches WP_Query as author__not_in | v Unsafe value reaches SQL NOT IN (...) construction | v Blind SQL timing or Boolean oracle | v Potential database compromise | v Potential application-level compromise and RCE ``` 检测器应在确认路由混淆和 SQL 注入原语后停止。它不需要提取数据或执行命令来证明受影响的安装存在漏洞。 ## 检测工作流 ### 阶段 1 — 规范化目标 该工具: 1. 如果缺少,则添加默认的 `http` 或 `https` 协议。 2. 规范化 WordPress 安装路径。 3. 拒绝不支持的 URL 协议和嵌入的凭据。 4. 应用重定向、代理、TLS 和超时策略。 ### 阶段 2 — 识别 WordPress 扫描器检查: - `wp-content/` 引用。 - `wp-includes/` 引用。 - WordPress 生成器元数据。 - REST API 发现链接。 - WordPress REST 索引结构。 - `wp/v2` 命名空间。 - 可选的 feed 和 `readme.html` 指纹。 ### 阶段 3 — 确定版本 版本证据可以来自: - HTML 生成器元数据。 - Feed 生成器元数据。 - WordPress 核心资源查询字符串。 - HTTP 生成器标头。 - `readme.html`。 - 本地的 `wp-includes/version.php` 文件。 证据会被评分和核对。冲突的远程版本指标会降低置信度。 ### 阶段 4 — 检查批量路由暴露情况 扫描器尝试通过以下方式发现 `/batch/v1`: ``` /?rest_route=/ /wp-json/ ``` 该路由可以通过以下任一方式寻址: ``` /?rest_route=/batch/v1 /wp-json/batch/v1 ``` ### 阶段 5 — 安全的路由混淆探测 安全探测包含: 1. 一个故意格式错误的内部路径。 2. 一个针对无效 post ID 的请求,附带一个无害的嵌套公共 `GET`。 3. 一个随后的 `/batch/v1` 请求。 易受攻击的服务器会返回一个外部的 `207 Multi-Status` 响应,其中无效的 post 请求被作为嵌套的批量请求进行处理。 检测器在观察到以下情况时会报告: ``` route-confusion-observed ``` 当它看到: - 预期的 `parse_path_failed` 标记。 - 状态为 `207` 的第二个外部响应。 - 显示无害内部请求已运行的嵌套 `responses` 数组。 ### 阶段 6 — 基于时间的 SQL 注入确认 非破坏性的 SQL 注入验证器应发送仅在常量布尔条件上有所不同的成对请求: ``` False control -> no deliberate database delay True test -> deliberate database delay ``` 验证器必须: - 接受预期的外部 HTTP `207`。 - 解析外部和嵌套的批量封装数据。 - 验证格式错误请求的标记。 - 确保包含 SQL 注入的嵌套请求返回了有效的响应。 - 收集多个 true 和 false 样本。 - 随机化或交替样本顺序。 - 比较中位数而不是单个请求。 - 如果测量数据不足,则报告为 `inconclusive`。 true 和 false 样本之间可重复的明显差距证实了攻击者控制的输入已到达 SQL 执行逻辑。无需选择或提取任何数据库内容。 ## 环境要求 - Python 3.9 或更高版本。 - 提供的脚本不需要任何第三方 Python 包。 - 到授权 WordPress 安装的网络访问权限。 - 对于本地测试: - 一个一次性的 WordPress 7.0.1 或 6.9.4 实验环境。 - 一个数据库容器或专用测试数据库。 - 绑定到 `127.0.0.1` 的 Web 服务。 - 没有生产环境的凭据或数据。 检查 Python: ``` python3 --version ``` 可选的语法验证: ``` python3 -m py_compile WP2Shell_CVE-2026-63030_POC.py ``` ## 安装 将提供的脚本重命名为一个可预测的文件名: ``` mv 'poc(1).py' WP2Shell_CVE-2026-63030_POC.py chmod +x WP2Shell_CVE-2026-63030_POC.py ``` 显示全局帮助: ``` python3 WP2Shell_CVE-2026-63030_POC.py --help ``` 显示版本: ``` python3 WP2Shell_CVE-2026-63030_POC.py --version ``` ## 命令 该脚本定义了三个命令: ``` remote Fingerprint and scan HTTP(S) WordPress targets. local Read the installed WordPress version from a source tree. exploit State-changing proof-of-concept path. ``` ### 当前构建状态 | 命令 | 状态 | |---|---| | `local` | 已实现 | | `remote` | CLI 已定义,但 `run_remote()` 目前是一个存根,并返回错误 | | `exploit` | 包含改变状态的功能;仅限于一次性的本地实验环境,并将其与防御性扫描分开 | 源码当前针对 `remote` 打印以下内容: ``` Remote scanning not fully implemented in this snippet. Use 'local' or 'exploit'. ``` 在将批量远程扫描宣传为功能可用之前,请恢复完整的 `run_remote()` 实现。 # 本地版本评估 `local` 命令读取: ``` /wp-includes/version.php ``` 并提取 `$wp_version`。 ## 基本用法 ``` python3 WP2Shell_CVE-2026-63030_POC.py local \ --wordpress-root /var/www/html ``` ## JSON 报告 ``` python3 WP2Shell_CVE-2026-63030_POC.py local \ --wordpress-root /var/www/html \ --format json \ --output local-result.json ``` ## 基于 Docker 的 WordPress 安装 当 WordPress 容器命名为 `wordpress` 时,将源代码树复制或挂载到主机,或者在容器内运行版本检查: ``` docker compose exec wordpress php -r \ 'require "/var/www/html/wp-includes/version.php"; echo $wp_version, PHP_EOL;' ``` ## 使用 compose.yaml 设置易受攻击的实验环境 使用提供的 `compose.yaml` 运行绑定到 `127.0.0.1:8080` 的一次性本地实验环境: ``` docker compose up -d ``` 一旦在浏览器中通过 `http://127.0.0.1:8080` 完成了首次 WordPress 设置,您就可以运行: ``` python3 WP2Shell_CVE-2026-63030_POC.py remote \ --authorized \ --target http://127.0.0.1:8080 \ --active-probe \ --format json ``` 停止并移除实验环境: ``` docker compose down -v ``` ## 本地命令选项 | 选项 | 描述 | |---|---| | `--wordpress-root PATH` | 必需的包含 `wp-includes/version.php` 的目录 | | `-f, --format` | `table`、`json`、`jsonl` 或 `csv` | | `-o, --output FILE` | 将报告写入文件 | | `--fail-on` | 退出代码策略:`never`、`vulnerable` 或 `unknown` | ## 易受攻击版本的输出示例 ``` [ { "selected_version": "7.0.1", "version_assessment": "affected-wp2shell", "verdict": "CONFIRMED_AFFECTED_VERSION", "severity": "critical" } ] ``` 本地版本结果确认安装的版本处于已公布的受影响范围内。但其本身并不能证明运行时的可利用性或向后移植补丁的效果。 # 远程扫描器接口 `remote` 解析器支持以下参数,但提供的 `run_remote()` 实现目前尚不完整。 ## 单一目标 恢复 `run_remote()` 后的预期接口: ``` python3 WP2Shell_CVE-2026-63030_POC.py remote \ --authorized \ --target https://wordpress.example \ --active-probe ``` ## 多个显式目标 ``` python3 WP2Shell_CVE-2026-63030_POC.py remote \ --authorized \ --target https://site-one.example \ --target https://site-two.example \ --active-probe ``` ## 目标文件 创建 `targets.txt`: ``` https://site-one.example/ https://site-two.example/blog/ ``` 预期接口: ``` python3 WP2Shell_CVE-2026-63030_POC.py remote \ --authorized \ --targets-file targets.txt \ --active-probe \ --format jsonl \ --output results.jsonl ``` ## 标准输入 ``` cat targets.txt | python3 WP2Shell_CVE-2026-63030_POC.py remote \ --authorized \ --stdin ``` ## 代理使用 ``` python3 WP2Shell_CVE-2026-63030_POC.py remote \ --authorized \ --target https://wordpress.example \ --active-probe \ --proxy http://127.0.0.1:8081 ``` ## 自定义请求标头 ``` python3 WP2Shell_CVE-2026-63030_POC.py remote \ --authorized \ --target https://wordpress.example \ --header 'Authorization: Bearer TEST_TOKEN' ``` ## 远程选项 | 选项 | 用途 | |---|---| | `-u, --target URL` | 目标 URL;可重复使用 | | `-l, --targets-file FILE` | 每行一个目标;可重复使用 | | `--stdin` | 从 stdin 读取目标 | | `--authorized` | 必需的授权确认 | | `--default-scheme` | 省略时应用的协议 | | `-c, --concurrency` | 并发目标工作线程 | | `--rate` | 总请求速率 | | `--timeout` | 单个请求的超时时间 | | `--retries` | 重试次数 | | `--max-targets` | 接受的最大目标数 | | `--max-body-bytes` | 保留的最大响应主体 | | `-k, --insecure` | 禁用 TLS 验证 | | `--no-redirects` | 禁用重定向 | | `--allow-cross-host-redirects` | 允许重定向到另一台主机 | | `--proxy` | HTTP/HTTPS 代理 | | `-H, --header` | 自定义标头;可重复使用 | | `--user-agent` | 覆盖 User-Agent | | `--fingerprint-level` | `quick`、`standard` 或 `extended` | | `--active-probe` | 发送安全的路由混淆探测 | | `--rest-endpoint` | `query`、`pretty` 或 `both` | | `--include-request-log` | 添加 URL、状态和计时元数据 | | `-f, --format` | `table`、`json`、`jsonl` 或 `csv` | | `-o, --output` | 将输出写入文件 | | `--fail-on` | 退出代码策略 | # 安全的运行时验证 为了对两个语进行非破坏性的本地验证,请使用一个专用的验证器,它: - 拒绝非环回主机。 - 首先确认路由混淆。 - 仅在路由混淆成功后运行常量条件的时间样本。 - 不提取数据或执行命令。 示例工作流: ``` python3 wp2shell_local_validator.py check \ --authorized \ --target http://127.0.0.1:8080 \ --sqli \ --delay 2 \ --samples 4 \ --warmups 2 \ --debug \ --dump-dir evidence \ --output result.json ``` 预期的易受攻击实验环境时间模式: ``` False controls: approximately 0.03–0.10 seconds True tests: consistently delayed ``` 预期判定: ``` FULL_VULNERABILITY_PRIMITIVES_CONFIRMED ``` 时间测试可以多次执行延迟表达式,因此配置的两秒延迟可能会产生接近四秒的观察延迟。重要的信号是 true 和 false 条件之间可重复的分离。 ## 输出格式 ### 表格 (Table) 最适合交互式终端使用: ``` --format table ``` ### JSON 最适合用于证据和集成: ``` --format json --output result.json ``` ### JSON Lines 最适合用于大型目标集: ``` --format jsonl --output results.jsonl ``` ### CSV 最适合用于电子表格和报告: ``` --format csv --output results.csv ``` ## 判定结果 | 判定 | 含义 | |---|---| | `CONFIRMED_VULNERABLE_BEHAVIOR` | 观察到运行时路由混淆行为 | | `CONFIRMED_AFFECTED_VERSION` | 本地源代码版本处于受影响范围内 | | `LIKELY_VULNERABLE` | 远程版本证据表明是受影响的版本 | | `VULNERABLE_SQLI_ONLY` | 版本受 CVE-2026-60137 影响,但超出了完整的路由混淆范围 | | `AFFECTED_VERSION_BUT_BEHAVIOR_NOT_OBSERVED` | 检测到受影响版本,但未观察到安全的运行时行为 | | `PATCHED_VERSION` | 版本符合已公布的修复边界 | | `NOT_AFFECTED` | 版本不在受影响的分支内 | | `POTENTIALLY_EXPOSED_VERSION_UNKNOWN` | 找到了 WordPress 和批量路由,但版本被隐藏 | | `WORDPRESS_VERSION_UNKNOWN` | 检测到 WordPress,但没有可靠的版本证据 | | `ERROR` | 无法评估目标 | | `NOT_WORDPRESS_OR_NOT_DETECTED` | 没有可靠的 WordPress 证据 | ## 退出代码 扫描器使用基于策略的退出代码。 | 代码 | 含义 | |---:|---| | `0` | 没有触发策略的结果,或使用了 `--fail-on never` | | `2` | 在默认策略下出现的易受攻击或受影响的结果 | | `3` | 当选择 `--fail-on unknown` 时出现的未知或不确定结果 | | `1` | 参数、输入或不完整命令的错误 | 因此,漏洞发现可能会特意返回一个非零状态。 示例: ``` python3 WP2Shell_CVE-2026-63030_POC.py local \ --wordpress-root /var/www/html \ --fail-on vulnerable echo $? ``` ## 易受攻击与已修复的对比测试 强有力的验证需要比较两个干净的环境。 ### 易受攻击的环境 ``` WordPress 7.0.1 ``` 预期: ``` route-confusion-observed repeatable true/false SQL timing difference ``` ### 已修复的环境 ``` WordPress 7.0.2 ``` 预期: ``` route-confusion-not-observed SQLi timing test not reached or no valid timing oracle ``` 在更改版本时,请务必重新创建 WordPress 卷。重复使用卷可能会保留旧的或自动更新的核心文件。 ``` docker compose down -v docker compose pull docker compose up -d ``` ## 修复方案 立即更新至以下修复版本之一或后续支持的版本: - WordPress 6.8.6。 - WordPress 6.9.5。 - WordPress 7.0.2。 - WordPress 7.1 beta2 或更高版本,用于预发布测试。 临时控制措施应覆盖两种批量端点形式: ``` /wp-json/batch/v1 /?rest_route=/batch/v1 ``` 额外的防御措施: 1. 检查日志,查找匿名批量请求、格式错误的内部 URL、嵌套的批量结构以及异常的 `author_exclude` 值。 2. 在任何暴露时间之后,检查管理员账户、插件更改、意外的 PHP 文件以及数据库访问权限。 3. 验证 WordPress Core 校验和,如果怀疑受到攻击,则从已知良好的备份中恢复。 4. 如果可能发生了 SQL 注入攻击,请轮换存储在 WordPress 数据库中的密钥和凭据。 阻止端点只是一种临时缓解措施,不能代替 WordPress Core 的更新。 ## 检测思路 潜在的指标包括: - 针对任一批量端点形式的匿名 `POST` 请求。 - 包含嵌套 `responses` 数组的 HTTP `207` 响应。 - 批量请求主体中格式错误的内部 URL。 - 另一个批量成员内的嵌套 `requests` 对象。 - 标量或 SQL 形式的 `author_exclude` 值。 - 反复出现的、交替具有快速和延迟响应的成对请求。 - 意外创建的 WordPress 管理员。 - 意外安装或激活的插件。 - 可写 WordPress 目录下的新 PHP 文件。 - 包含异常 `author__not_in` 表达式的数据库查询。 ## 提供脚本的已知限制 - Cookie 处理不等同于持久的浏览器会话。 - 在某些代码路径中假定了数据库表前缀。 - 数据库的 `FILE` 权限和文件系统路径因部署而异。 - `INTO OUTFILE` 通常受到限制,无法覆盖现有文件。 - WordPress 可能通过 `DISALLOW_FILE_MODS` 禁用插件安装。 - 时间阈值可能会受到代理、WAF、PHP 超时、数据库超时和负载的影响。 - 版本字符串可能会被隐藏、欺骗、缓存或不一致。 - 观察到的受影响版本并不能证明没有进行过安全补丁的向后移植。 - 缺少时间信号并不能证明服务器已修补。 ## 参考文献 - WordPress 7.0.2 安全版本发布: https://wordpress.org/news/2026/07/wordpress-7-0-2-release/ - WordPress 7.0.2 文档和更改的文件: https://wordpress.org/documentation/wordpress-version/version-7-0-2/ - NVD — CVE-2026-63030: https://nvd.nist.gov/vuln/detail/CVE-2026-63030 - NVD — CVE-2026-60137: https://nvd.nist.gov/vuln/detail/CVE-2026-60137 - WordPress 版本归档: https://wordpress.org/download/releases/ ## 合法与道德使用 仅在满足以下条件时使用本项目: - 您拥有该系统,或者 - 您拥有明确的书面授权,并且 - 请求的测试活动在商定的范围内。 不要将故意设置的易受攻击的 WordPress 安装暴露在公共互联网上。使用一次性凭据、合成数据、隔离的网络和干净的快照。测试后销毁或重置实验环境。 最安全的漏洞证明是展示该问题所需的最少证据: ``` Affected version + Route-confusion behavior + Repeatable constant-condition SQL timing oracle ``` 窃取凭据、建立持久化、安装 webshell 和执行命令对于确认漏洞存在是不必要的。
标签:CISA项目, PoC, Python, WordPress, 无后门, 暴力破解, 请求拦截, 逆向工具