Yunucms代码审计:后台XSS和数据库信息泄露
字数 987 2025-08-26 22:11:56
Yunucms代码审计:后台XSS和数据库信息泄露漏洞分析
1. 系统概述
Yunucms(云优CMS)是一款基于TP5.0框架开发的开源城市分站内容管理系统,前身为远航CMS。系统提供以下主要功能:
- 二级域名分站
- 内容分站独立
- 七牛云存储
- 自定义字段和表单
- 自定义栏目和管理权限
2. 漏洞环境搭建
- 从官网下载源码并安装
- 注册云账号(测试账号:testqwe/123456)
- 填写MySQL数据库信息完成安装
3. 后台XSS漏洞分析
3.1 漏洞复现步骤
- 登录后台访问TAG管理模块
- 添加TAG时在名称字段插入XSS代码(如
<script>alert(1)</script>) - 提交后返回TAG列表页面触发XSS
3.2 漏洞代码分析
漏洞位于/index.php?s=/admin/tagurl/addtagurl路由:
public function addTagurl()
{
if(request()->isAjax()){
$param = input('post.'); // 获取用户输入
$tagurl = new TagurlModel();
$flag = $tagurl->insertTagurl($param); // 直接保存输入
return json(['code' => $flag['code'], 'data' => $flag['data'], 'msg' => $flag['msg']]);
}
return $this->fetch();
}
关键问题点:
- 直接接收用户输入(
input('post.')) - 未进行任何过滤直接保存到数据库
- 输出时未进行HTML编码
3.3 漏洞调用链
addTagurl()接收用户输入- 调用
insertTagurl()方法保存数据 - 最终通过PDO的
bindValue()直接绑定参数,无过滤:
$this->PDOStatement->bindValue($param, $val);
4. 数据库信息泄露漏洞分析
4.1 漏洞复现步骤
- 登录后台访问"系统管理->数据库管理"
- 执行数据库备份操作
- 备份文件默认保存在
/data目录下 - 文件名采用时间戳命名(如
Ymd-His格式) - 可直接通过URL访问并下载备份文件
4.2 漏洞代码分析
备份功能位于/index.php?s=/admin/data/export:
public function export($ids = null, $id = null, $start = null) {
$Request = Request::instance();
if ($Request->isPost() && !empty($ids) && is_array($ids)) {
$path = config('data_backup_path');
// 生成备份文件名(使用当前时间)
$file = [
'name' => date('Ymd-His', $Request->time()),
'part' => 1,
];
session('backup_file', $file);
// 创建备份文件
$Database = new \com\Database($file, $config);
if (false !== $Database->create()) {
$tab = ['id' => 0, 'start' => 0];
return $this->success('初始化成功!', '', ['tables' => $ids, 'tab' => $tab]);
}
}
}
关键问题点:
- 备份文件名使用可预测的时间戳格式(
Ymd-His) - 备份文件存储在web可访问目录
- 无访问权限控制
5. 漏洞修复建议
5.1 XSS漏洞修复
- 输入过滤:
// 在接收参数时进行HTML实体编码
$param = htmlspecialchars(input('post.'), ENT_QUOTES);
- 输出编码:
<!-- 在模板中使用模板引擎的转义功能 -->
{$tag_name|htmlspecialchars}
5.2 数据库泄露漏洞修复
- 修改备份文件命名规则:
// 使用随机字符串作为文件名
$file = [
'name' => md5(uniqid().mt_rand(1000,9999)),
'part' => 1,
];
- 设置备份目录访问权限:
location ^~ /data/ {
deny all;
}
- 添加身份验证:
// 检查下载权限
public function downloadBackup($filename) {
if(!session('admin_id')) {
$this->error('无权访问');
}
// 下载逻辑...
}
6. 总结
- 后台漏洞同样具有高风险,不应忽视其危害
- XSS漏洞源于未过滤的用户输入和未编码的输出
- 数据库泄露漏洞源于可预测的文件名和不当的访问控制
- 安全开发应遵循"不信任任何输入"和"最小权限"原则
通过这两个漏洞的组合利用,攻击者可能实现从XSS到服务器完全控制的全链条攻击,因此后台系统的安全性同样需要高度重视。