
Kalrav AI Agent <= 2.3.3 - बिना प्रमाणीकरण के मनमानी फ़ाइल अपलोड करने की सुविधा kalrav_upload_file AJAX कार्रवाई के माध्यम से
WordPress Kalrav AI Agent प्लगइन (संस्करण 2.3.3 और पूर्व) में एक मनमानी फ़ाइल अपलोड भेद्यता है जो बिना प्रमाणीकृत उपयोगकर्ताओं को सर्वर पर दुर्भावनापूर्ण PHP फ़ाइलें अपलोड करने की अनुमति देती है, जो संभावित रूप से रिमोट कोड निष्पादन की ओर ले जाती है।
एक POC CVE-2025-13374.py प्रदान किया गया है जो एक रिमोट हमलावर द्वारा shell.php अपलोड करने और रिमोट कोड निष्पादित करने का प्रदर्शन करता है:
python3 ./CVE-2025-13374.py http://techcorp.cc
[+] Target: http://techcorp.cc
[+] File uploaded successfully!
[+] Shell URL: http://techcorp.cc/wp-content/plugins/kalrav-ai-agent/uploads/1763247725-shell.php
[+] Command output:
www-data
यह भेद्यता /wp-admin/admin-ajax.php एंडपॉइंट पर फ़ंक्शन में मौजूद है। अपलोड कार्यक्षमता में उचित फ़ाइल सत्यापन, नॉन्स सत्यापन और क्षमता जाँच का अभाव है। यह बिना प्रमाणीकृत उपयोगकर्ताओं को मनमानी फ़ाइलें, जिनमें सर्वर पर निष्पादित की जा सकने वाली PHP फ़ाइलें शामिल हैं, अपलोड करने की अनुमति देता है।
kalrav_upload_file()स्रोत: $_FILES['file'] से उपयोगकर्ता इनपुट (लाइन 978)
सिंक: move_uploaded_file($_FILES['file']['tmp_name'], $target_path) (लाइन 982)
यह भेद्यता निम्न कारणों से होती है:
wp_ajax_nopriv_kalrav_upload_file हुक (लाइन 967) के माध्यम से पंजीकृत है, जो बिना प्रमाणीकरण पहुंच की अनुमति देता है।wp_ajax_nopriv_ उपसर्ग फ़ंक्शन को बिना प्रमाणीकृत उपयोगकर्ताओं के लिए सुलभ बनाता है।$_FILES['file'] से उपयोगकर्ता-नियंत्रित फ़ाइल डेटा बिना सत्यापन के सीधे संसाधित किया जाता है।basename() का उपयोग करके बुनियादी फ़ाइल नाम स्वच्छता लागू की गई है: time() . '-' . basename($_FILES['file']['name']) (लाइन 979), जो केवल निर्देशिका ट्रैवर्सल को रोकता है लेकिन फ़ाइल एक्सटेंशन को मान्य नहीं करता।wp-content/plugins/kalrav-ai-agent/uploads/ में सहेजी जाती हैं।फ़ाइल: kalrav-ai-agent.php
लाइनें: 969-996
add_action('wp_ajax_kalrav_upload_file', 'kalrav_upload_file');
add_action('wp_ajax_nopriv_kalrav_upload_file', 'kalrav_upload_file');
function kalrav_upload_file()
{
// Path to your plugin uploads folder
$upload_dir = plugin_dir_path(__FILE__) . 'uploads/';
if (!file_exists($upload_dir)) {
mkdir($upload_dir, 0755, true);
}
if (!empty($_FILES['file']['name'])) {
$file_name = time() . '-' . basename($_FILES['file']['name']);
$target_path = $upload_dir . $file_name;
if (move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
wp_send_json_success([
'message' => 'File uploaded successfully!',
'file_path' => $target_path,
'url' => plugins_url('uploads/' . $file_name, __FILE__)
]);
} else {
wp_send_json_error(['message' => 'Failed to move uploaded file.']);
}
} else {
wp_send_json_error(['message' => 'No file uploaded.']);
}
wp_die();
}