
Alex Reservations: स्मार्ट रेस्टोरेंट बुकिंग <= 2.2.3 - प्रमाणित (एडमिन+) मनमाना फ़ाइल अपलोड
वर्डप्रेस Alex Reservations प्लगइन (संस्करण 2.2.3 और पुराने) में एक मनमाना फ़ाइल अपलोड भेद्यता है जो प्रमाणित वर्डप्रेस व्यवस्थापकों को सर्वर पर दुर्भावनापूर्ण PHP फ़ाइलें अपलोड करने की अनुमति देती है, जिससे संभावित रूप से रिमोट कोड निष्पादन हो सकता है।
एक रिमोट हमलावर द्वारा shell.php अपलोड करने और रिमोट कोड निष्पादित करने को प्रदर्शित करने के लिए एक POC CVE-2025-12399.py प्रदान किया गया है:
python3 ./CVE-2025-12399.py https://TARGETSITE.com admin "$PASSWORD"
[+] Target: http://TARGETSITE.com
[+] Username: admin
[+] Nonce obtained: 022b25d0a5
[+] File uploaded successfully!
[+] Shell URL: https://TARGETSITE.com/wp-content/uploads/alex-reservations/2025/10/shell.php
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
भेद्यता UploadFileController.php फ़ाइल में /wp-json/srr/v1/app/upload/file एंडपॉइंट पर मौजूद है। अपलोड कार्यक्षमता में उचित फ़ाइल सत्यापन का अभाव है और यह केवल रेगेक्स पैटर्न का उपयोग करके बुनियादी फ़ाइल नाम सैनिटाइज़ेशन करती है। यह प्रमाणित वर्डप्रेस व्यवस्थापकों को सर्वर पर निष्पादित की जा सकने वाली PHP फ़ाइलों सहित मनमानी फ़ाइलें अपलोड करने की अनुमति देता है।
स्रोत: $_FILES['file'] से उपयोगकर्ता इनपुट (पंक्ति 13)
सिंक: copy($file['tmp_name'], $target_dir_file) (पंक्ति 38)
भेद्यता निम्न कारणों से होती है:
routes.php में पंजीकृत है।UploadFileController बेस Controller का विस्तार करता है।$_FILES['file'] से उपयोगकर्ता-नियंत्रित फ़ाइल डेटा को बिना सत्यापन के सीधे संसाधित किया जाता है।preg_replace('/[^a-z0-9_\.\-[:space:]]/i', '_', $file_name) (पंक्ति 50)wp-content/uploads/alexr-uploads/YYYY/MM/ में सहेजा जाता है।फ़ाइल: includes/application/Alexr/Http/Controllers/UploadFileController.php
पंक्तियाँ: 11-53
public function upload(Request $request)
{
$file = $_FILES['file']; // SOURCE: User input ([line 13](https://plugins.trac.wordpress.org/browser/alex-reservations/trunk/includes/application/Alexr/Http/Controllers/UploadFileController.php#L13))
// Target dir / url
$upload_dir = wp_upload_dir();
$date = evavel_date_now()->format('Y/m');
$base_dir = $upload_dir['basedir'].'/'.ALEXR_UPLOAD_FOLDER.'/'.$date;
$base_url = $upload_dir['baseurl'].'/'.ALEXR_UPLOAD_FOLDER.'/'.$date;
if (!file_exists($base_dir)) {
$folder_created = wp_mkdir_p($base_dir);
if (!$folder_created) {
return $this->response([
'success' => false,
'error' => __eva('Error creating folder.')
]);
}
}
$file_name = $file['name'];
$file_name = preg_replace('/[^a-z0-9_\.\-[:space:]]/i', '_', $file_name); // Only basic sanitization ([line 50](https://plugins.trac.wordpress.org/browser/alex-reservations/trunk/includes/application/Alexr/Http/Controllers/UploadFileController.php#L50))
$target_dir_file = $base_dir.'/'.$file_name;
$target_url_file = $base_url.'/'.$file_name;
$result = copy($file['tmp_name'], $target_dir_file); // SINK: Direct file copy ([line 38](https://plugins.trac.wordpress.org/browser/alex-reservations/trunk/includes/application/Alexr/Http/Controllers/UploadFileController.php#L38))
if (!$result) {
return $this->response([
'success' => false,
'error' => __eva('Error saving file.')
]);
}
return $this->response([
'success' => true,
'file_path' => $target_dir_file,
'file_url' => $target_url_file,
'message' => __eva('Uploaded.')
]);
}