HisiCms代码审计
字数 1182 2025-08-09 17:09:29

HisiCMS代码审计与漏洞分析教学文档

一、HisiCMS简介

HisiCMS是一款基于PHP开发的内容管理系统,官方网址:https://www.hisiphp.com/

二、安装处Getshell漏洞分析

漏洞位置

step4()方法中的数据库配置处理部分

漏洞原理

  1. 安装过程中获取POST数据时未进行充分过滤
  2. 数据库配置直接写入config/database.php文件
  3. 攻击者可控制数据库配置参数,导致任意代码执行

关键代码分析

private function step4()
{
    if ($this->request->isPost()) {
        if (!is_writable($this->root_path.'config/database.php')) {
            return $this->error('[config/database.php]无读写权限!');
        }

        $data = $this->request->post(); // 获取POST数据,未过滤
        $data['type'] = 'mysql';
        
        // 验证规则不包含对危险字符的过滤
        $rule = [
            'hostname|服务器地址' => 'require',
            'hostport|数据库端口' => 'require|number',
            'database|数据库名称' => 'require',
            'username|数据库账号' => 'require',
            'prefix|数据库前缀' => 'require|regex:^[a-z0-9]{1,20}[_]{1}',
            'cover|覆盖数据库' => 'require|in:0,1',
        ];

        $validate = $this->validate($data, $rule);
        
        // 验证通过后直接写入配置文件
        $config = include $this->root_path.'config/database.php';
        foreach ($data as $k => $v) {
            if (array_key_exists($k, $config) === false) {
                return $this->error('参数'.$k.'不存在!');
            }
        }
        
        // 创建数据库连接
        $db_connect = Db::connect($data);
    }
}

攻击利用方式

  1. 在安装过程中,通过POST提交恶意数据库配置
  2. 在数据库相关参数中插入PHP代码
  3. 当配置文件被包含时,插入的代码将被执行

防御建议

  1. 对数据库配置参数进行严格过滤
  2. 使用白名单方式验证输入
  3. 对写入文件的内容进行转义处理

三、任意文件上传漏洞分析

漏洞位置

系统配置保存功能中的上传配置处理

漏洞原理

  1. 系统配置保存时未对上传文件类型和大小配置进行充分验证
  2. 攻击者可修改上传配置,允许上传危险文件类型
  3. 结合上传功能实现任意文件上传

关键代码分析

public function index($group = 'base')
{
    if ($this->request->isPost()) {
        $webPath = './';
        $data = $this->request->post(); // 获取POST数据
        $types = $data['type'];
        $ids = $data['id']; // 配置数据
        
        if (!$types) return false;
        
        foreach ($types as $k => $v) {
            // 处理checkbox类型
            if ($v == 'checkbox') {
                if (isset($ids[$k])) {
                    $ids[$k] = implode(',', $ids[$k]);
                } else {
                    $ids[$k] = '';
                }
            }
            
            // 直接更新配置,无过滤
            ConfigModel::where('name', $k)->update(['value' => $ids[$k]]);
        }
    }
}

上传验证部分:

public function upload($from = 'input', $group = 'sys', $water = '', $thumb = '', $thumb_type = '', $input = 'file')
{
    return json(AnnexModel::upload($from, $group, $water, $thumb, $thumb_type, $input));
}

// 上传验证
if ($file->checkExt(config('upload.upload_file_ext'))) {
    $type = 'file';
    if (config('upload.upload_file_size') > 0 && !$file->checkSize(config('upload.upload_file_size')*1024)) {
        return self::result('上传的文件大小超过系统限制['.config('upload.upload_file_size').'KB]!', $from);
    }
}

目录穿越漏洞

路由采用伪静态形式,可通过修改group参数实现目录穿越:
xxx?group=/../

攻击利用方式

  1. 修改系统上传配置,允许上传.php等危险文件类型
  2. 通过上传功能上传Webshell
  3. 结合目录穿越漏洞将文件上传到非预期目录

防御建议

  1. 对系统配置修改进行权限控制
  2. 固定上传文件类型配置,不允许通过前端修改
  3. 对上传文件进行严格的类型检查和内容验证
  4. 处理路径时进行规范化,防止目录穿越

四、综合防御方案

  1. 输入验证

    • 对所有用户输入进行严格过滤
    • 使用白名单而非黑名单验证
    • 对特殊字符进行转义处理
  2. 文件操作安全

    • 文件写入前检查内容安全性
    • 限制配置文件的写入权限
    • 对文件路径进行规范化处理
  3. 上传安全

    • 固定上传文件类型配置
    • 对上传文件进行二次渲染
    • 存储上传文件时修改文件名和扩展名
  4. 权限控制

    • 系统配置修改需要更高权限
    • 安装完成后禁用安装模块
    • 实现操作日志记录

五、漏洞验证与复现

安装处Getshell复现步骤

  1. 访问HisiCMS安装页面
  2. 拦截数据库配置步骤的POST请求
  3. 在数据库相关参数中插入PHP代码
  4. 完成安装,访问配置文件触发代码执行

任意文件上传复现步骤

  1. 登录系统后台,找到系统配置页面
  2. 修改上传文件类型配置,添加.php等危险类型
  3. 通过文件上传功能上传Webshell
  4. 访问上传的Webshell文件

六、总结

通过对HisiCMS的代码审计,发现其存在两处高危漏洞:

  1. 安装过程中的数据库配置写入漏洞,可导致Getshell
  2. 系统配置修改导致的任意文件上传漏洞

这两个漏洞都源于对用户输入信任过度,缺乏充分的验证和过滤。在实际开发中,应遵循"不信任任何用户输入"的原则,对所有输入进行严格验证,并对关键操作进行权限控制。

HisiCMS代码审计与漏洞分析教学文档 一、HisiCMS简介 HisiCMS是一款基于PHP开发的内容管理系统,官方网址:https://www.hisiphp.com/ 二、安装处Getshell漏洞分析 漏洞位置 step4() 方法中的数据库配置处理部分 漏洞原理 安装过程中获取POST数据时未进行充分过滤 数据库配置直接写入 config/database.php 文件 攻击者可控制数据库配置参数,导致任意代码执行 关键代码分析 攻击利用方式 在安装过程中,通过POST提交恶意数据库配置 在数据库相关参数中插入PHP代码 当配置文件被包含时,插入的代码将被执行 防御建议 对数据库配置参数进行严格过滤 使用白名单方式验证输入 对写入文件的内容进行转义处理 三、任意文件上传漏洞分析 漏洞位置 系统配置保存功能中的上传配置处理 漏洞原理 系统配置保存时未对上传文件类型和大小配置进行充分验证 攻击者可修改上传配置,允许上传危险文件类型 结合上传功能实现任意文件上传 关键代码分析 上传验证部分: 目录穿越漏洞 路由采用伪静态形式,可通过修改group参数实现目录穿越: xxx?group=/../ 攻击利用方式 修改系统上传配置,允许上传.php等危险文件类型 通过上传功能上传Webshell 结合目录穿越漏洞将文件上传到非预期目录 防御建议 对系统配置修改进行权限控制 固定上传文件类型配置,不允许通过前端修改 对上传文件进行严格的类型检查和内容验证 处理路径时进行规范化,防止目录穿越 四、综合防御方案 输入验证 : 对所有用户输入进行严格过滤 使用白名单而非黑名单验证 对特殊字符进行转义处理 文件操作安全 : 文件写入前检查内容安全性 限制配置文件的写入权限 对文件路径进行规范化处理 上传安全 : 固定上传文件类型配置 对上传文件进行二次渲染 存储上传文件时修改文件名和扩展名 权限控制 : 系统配置修改需要更高权限 安装完成后禁用安装模块 实现操作日志记录 五、漏洞验证与复现 安装处Getshell复现步骤 访问HisiCMS安装页面 拦截数据库配置步骤的POST请求 在数据库相关参数中插入PHP代码 完成安装,访问配置文件触发代码执行 任意文件上传复现步骤 登录系统后台,找到系统配置页面 修改上传文件类型配置,添加.php等危险类型 通过文件上传功能上传Webshell 访问上传的Webshell文件 六、总结 通过对HisiCMS的代码审计,发现其存在两处高危漏洞: 安装过程中的数据库配置写入漏洞,可导致Getshell 系统配置修改导致的任意文件上传漏洞 这两个漏洞都源于对用户输入信任过度,缺乏充分的验证和过滤。在实际开发中,应遵循"不信任任何用户输入"的原则,对所有输入进行严格验证,并对关键操作进行权限控制。