CVE-2026-87902 WordPress Core 检测器。
get_page_template() 可被操纵,使页面模板解析包含活动主题之外的可读本地 .php 文件。WPSniper 对站点进行指纹识别,选取一个已发布的 page_id,探测 include 类,仅当探测响应体中存在唯一的强 PEAR 特征时,才输出 VULN。
仅检测。无 webshell。无 pearcmd config-create。无操作系统命令执行。
python3 WPSniper.py -u https://lab.wordpress.local --shell
流水线:
subfinder -d lab.example -silent | httpx -silent | python3 WPSniper.py -t 8
限定范围。自有实验环境。这就是运行它的全部许可。
WordPress 从 URL 派生、经 url 解码的 pagename 查询变量构建页面模板名称:
page-{$pagename}.php
随后 locate_template() 包含该文件。在受影响的版本中,解析后的路径并未被强制限制在允许的主题目录内。pagename 中的双重编码路径遍历在 sanitize_title 处理后仍能存活,足以让 get_page_template() 解码一次并跳出主题目录树。
在闭合的 include 之前存在两个前提条件:
page- 开头(WordPress 文档中的 page-templates/ — Twenty Twelve、Twenty Fourteen、Neve、Hestia、Sydney 等)。.php 目标文件。检测器使用标准 PEAR CLI 横幅作为 include 判定依据。它不会写入任何文件。当这些条件加上可写/可执行的利用链同时满足时,RCE 是可能的后续影响。该后续影响不在本仓库中。
CVE 发现者致谢:Robert (ressl),通过 WordPress HackerOne。公告:GHSA-7hp8-65ch-5whp。
| 步骤 | 操作 | 信号 |
|---|---|---|
| 1 | 首页 + generator + /feed/ | 是 WordPress 吗?版本?主题别名? |
| 2 | REST /wp-json/wp/v2/pages 或 HTML 中的 page_id= | 一个已发布的页面,使模板路径实际执行 |
| 3 | GET /wp-content/themes/{slug}/page-templates/ | 200 / 401 / 403 = 目录存在 |
| 4 | 基线 ?page_id=N 对比探测 pagename= | 响应体摘要 + 唯一强 PEAR 特征 |
版本表已内置。4.7.0–7.1.1 为受影响窗口。已修补版本:7.1.2、7.0.6、6.9.9、6.8.10 … 回溯至 4.7.37。
一篇博客文章中提到“pearcmd”的营销页面不算命中。
仅当以下全部为真时才判定 VULN:
?page_id= 摘要PEAR Version:、Usage: pear、PEAR_Config、Commands for pear、config-create、DEPRECATED: PEAR commands、pear.php)pearcmd / PEAR 单独出现时被丢弃,尤其是当它已存在于基线 HTML 中时INFO = 受影响版本和/或 page-templates 目录存在,include 未闭合。不要将 INFO 报告为严重漏洞。
SAFE = 已修补分支,或 include 与基线一致。
SKIP = 非 WordPress,URL 无效。
/etc/passwd 不是此 CVE 的正确判定依据。locate_template() 会追加 .php。交互式 passwd 命令的存在是为了让你亲眼看到这一点。出现 root:x:0:0: 片段是不寻常的,必须手动验证。
python3 -m pip install -r requirements.txt
python3 WPSniper.py -u https://lab.wordpress.local
需要 requests。
| 参数 | 含义 |
|---|---|
-u URL | 单个目标 |
-l file | URL 列表 |
| stdin | subfinder | httpx | WPSniper |
-t N | 列表上的线程数(默认 6) |
-q | 静默行 + 摘要 |
--shell | 对单个 -u 进行交互式探测 |
--timeout | 秒数(默认 14) |
--shell 在流水线中被忽略。这是有意为之。
python3 WPSniper.py -u https://lab.wordpress.local --shell
[email protected] ▶
1 fp 版本 / 主题 / 是否已修补?
2 pages REST 已发布页面
3 theme page-templates 目录
4 probe PEAR include + 基线差异 (不写入)
5 diff 同上,打印 Δ + 特征
6 passwd 尝试 …/etc/passwd (此类包含 *.php)
7 include P 包含一个不带后缀的 .php 路径
8 save 最后的响应体 → /tmp/wpsniper-probe.html
9 help
0 exit
每次探测都会打印完整 URL 和可直接复制粘贴的 curl。在报告中使用它。不要编造第二个请求。
7 include 用于你已放置的授权实验文件。帮助文本中的示例名称是见证标记,不是投放器。
WPSniper v1.3 CVE-2026-87902 get_page_template LFI
[radar] target https://lab.wordpress.local
[radar] generator=6.8.3 theme=twentytwelve status=affected
[radar] page_id=2
[radar] theme dir /wp-content/themes/twentytwelve/page-templates/ → 403
VULN lab.wordpress.local unique=['PEAR Version:','Usage: pear'] Δlen=+18420
patched 7.1.2 · 7.0.6 · 6.8.10 · backports to 4.7.37
本页中的主机是实验标签。真实客户主机名不应出现在公开截图中。
升级至 7.1.2 或你所在分支的回溯版本:
7.0.6 · 6.9.9 · 6.8.10 · 6.7.9 · 6.6.9 · 6.5.12 · 6.4.12 · 6.3.12 · 6.2.13 · 6.1.14 · 6.0.16 · 5.9.18 … 直至 4.7.37。
7.1.2 还要求解析后的模板路径保持在允许的主题目录内。这才是真正的修复,而非 WAF 规则。
pearcmd config-create,无 system() 包装器/etc/passwd 作为主要确认依据如果你需要一份发现报告:附上 WPSniper 已打印的 curl、唯一的强特征,以及基线摘要不匹配。
仅限授权安全测试。对你不拥有或未获得书面授权的主机运行此工具,是你的问题,不是工具的问题。
mitsec · Yunus Emre Öztaş