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 端点中的 kalrav_upload_file() 函数中。上传功能缺少适当的文件验证、nonce 验证和权限检查。这使得未认证用户可以上传任意文件,包括可在服务器上执行的 PHP 文件。
Source:来自 $_FILES['file'] 的用户输入(第 978 行)
Sink: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();
}