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