
Kalrav AI Agent <= 2.3.3 - رفع ملفات تعسفي غير مصادق عليه عبر kalrav_upload_file AJAX Action
يحتوي إضافة ووردبريس Kalrav AI Agent (الإصدار 2.3.3 وما قبله) على ثغرة رفع ملف عشوائي تسمح للمستخدمين غير المصادق عليهم برفع ملفات PHP ضارة إلى الخادم، مما قد يؤدي إلى تنفيذ تعليمات برمجية عن بُعد.
يتم توفير إثبات مفهوم 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
توجد الثغرة في دالة kalrav_upload_file() عند نقطة النهاية /wp-admin/admin-ajax.php. تفتقر وظيفة الرفع إلى التحقق السليم من الملف، والتحقق من nonce، وفحوصات الصلاحية. وهذا يسمح للمستخدمين غير المصادق عليهم برفع ملفات عشوائية، بما في ذلك ملفات PHP التي يمكن تنفيذها على الخادم.
المصدر: إدخال المستخدم من $_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();
}