一次对基于thinkphp开发程序的审计
字数 1365 2025-08-26 22:11:45

ThinkPHP 5.1 代码审计实战教学文档

一、审计前准备

  1. 了解目标系统架构

    • 基于ThinkPHP 5.1开发的多应用系统
    • 主要关注目录:
      • application(主程序)
      • public(公开文件夹)
  2. 熟悉ThinkPHP开发文档

    • 理解框架的MVC结构和常见函数
  3. 安装并运行目标系统

    • 按照教程安装源码
    • 通过功能点测试了解系统业务逻辑

二、文件上传漏洞审计

1. 图片上传接口审计

  • 文件路径:/index/controller/upload.php
  • 安全机制:
    • 使用白名单过滤上传文件类型
    • 无中间件解析漏洞配合
  • 结论:无有效文件上传漏洞

2. 音频上传接口审计

  • 安全机制:
    • 直接重命名上传文件
    • 无中间件解析漏洞配合
  • 结论:无有效文件上传漏洞

三、SQL注入漏洞审计

1. 审计方法

  • 全局搜索关键词:
    • query
    • $sql
    • select(
    • where(
  • 寻找直接拼接SQL或使用原始SQL查询的代码

2. 第一处潜在注入点

  • 位置:私有函数census()
  • 问题:
    • 直接拼接参数到SQL语句
    • 使用db->query()执行
  • 审计结果:
    • 传入参数不受用户控制
    • 无法形成有效注入

3. 第二处有效注入点

  • 相关文件:
    • /seller/model/chat.php
    • /seller/controller/log.php
  • 漏洞特征:
    • SQL语句直接拼接
    • 语句构造复杂
  • 验证方法:
    • 查看数据库查询日志
    • 请求路由:/seller/log/getChatLogDetail
  • 注入点位置:
    • content字段存在like型注入
  • 验证Payload:
    • %' or 1=1#
  • 漏洞确认:
    • Payload被直接拼接到SQL语句
    • 未被任何过滤处理

四、任意文件读取漏洞审计

1. 审计方法

  • 全局搜索关键词:
    • file_put_contents
    • file_get_content

2. 漏洞发现

  • 文件路径:/seller/controller/words.php
  • 漏洞特征:
    • 从项目根目录读取文件
    • 文件路径由words参数控制
  • 利用方法:
    • 构造请求读取任意文件
    • 文件内容会被存入数据库
  • 后续利用:
    • 可通过注入或页面查看读取的文件内容

五、插件与框架历史漏洞审计

1. UEditor插件审计

  • 路径:/public/static/common/js/ueditor
  • 版本:1.4.3
  • 已知漏洞:
    • 仅ASP版本存在漏洞
    • PHP版本有严格后缀过滤
  • 结论:无法利用

2. ThinkPHP 5.1反序列化漏洞

  • 审计方法:
    • 全局搜索unserialize()函数
  • 结果:
    • 未发现相关函数调用
  • 结论:无法利用

六、完整审计流程总结

  1. 文件上传功能审计

    • 检查所有上传接口
    • 验证过滤机制有效性
  2. SQL注入审计

    • 查找原始SQL查询
    • 验证参数过滤情况
    • 通过日志确认注入
  3. 文件操作审计

    • 查找文件读写函数
    • 验证参数可控性
  4. 插件与框架漏洞检查

    • 确认第三方组件版本
    • 检查已知漏洞利用条件
  5. 其他常见漏洞检查

    • 命令执行函数(未发现)
    • 文件包含(未发现)

七、修复建议

  1. SQL注入修复

    • 使用预处理语句
    • 对输入参数进行严格过滤
  2. 任意文件读取修复

    • 限制文件读取目录
    • 对输入参数进行白名单过滤
  3. 整体安全建议

    • 更新框架到最新版本
    • 定期进行安全审计
    • 实施严格的输入验证机制
ThinkPHP 5.1 代码审计实战教学文档 一、审计前准备 了解目标系统架构 基于ThinkPHP 5.1开发的多应用系统 主要关注目录: application (主程序) public (公开文件夹) 熟悉ThinkPHP开发文档 理解框架的MVC结构和常见函数 安装并运行目标系统 按照教程安装源码 通过功能点测试了解系统业务逻辑 二、文件上传漏洞审计 1. 图片上传接口审计 文件路径: /index/controller/upload.php 安全机制: 使用白名单过滤上传文件类型 无中间件解析漏洞配合 结论:无有效文件上传漏洞 2. 音频上传接口审计 安全机制: 直接重命名上传文件 无中间件解析漏洞配合 结论:无有效文件上传漏洞 三、SQL注入漏洞审计 1. 审计方法 全局搜索关键词: query $sql select( where( 寻找直接拼接SQL或使用原始SQL查询的代码 2. 第一处潜在注入点 位置:私有函数 census() 问题: 直接拼接参数到SQL语句 使用 db->query() 执行 审计结果: 传入参数不受用户控制 无法形成有效注入 3. 第二处有效注入点 相关文件: /seller/model/chat.php /seller/controller/log.php 漏洞特征: SQL语句直接拼接 语句构造复杂 验证方法: 查看数据库查询日志 请求路由: /seller/log/getChatLogDetail 注入点位置: content 字段存在 like 型注入 验证Payload: %' or 1=1# 漏洞确认: Payload被直接拼接到SQL语句 未被任何过滤处理 四、任意文件读取漏洞审计 1. 审计方法 全局搜索关键词: file_put_contents file_get_content 2. 漏洞发现 文件路径: /seller/controller/words.php 漏洞特征: 从项目根目录读取文件 文件路径由 words 参数控制 利用方法: 构造请求读取任意文件 文件内容会被存入数据库 后续利用: 可通过注入或页面查看读取的文件内容 五、插件与框架历史漏洞审计 1. UEditor插件审计 路径: /public/static/common/js/ueditor 版本:1.4.3 已知漏洞: 仅ASP版本存在漏洞 PHP版本有严格后缀过滤 结论:无法利用 2. ThinkPHP 5.1反序列化漏洞 审计方法: 全局搜索 unserialize() 函数 结果: 未发现相关函数调用 结论:无法利用 六、完整审计流程总结 文件上传功能审计 检查所有上传接口 验证过滤机制有效性 SQL注入审计 查找原始SQL查询 验证参数过滤情况 通过日志确认注入 文件操作审计 查找文件读写函数 验证参数可控性 插件与框架漏洞检查 确认第三方组件版本 检查已知漏洞利用条件 其他常见漏洞检查 命令执行函数(未发现) 文件包含(未发现) 七、修复建议 SQL注入修复 使用预处理语句 对输入参数进行严格过滤 任意文件读取修复 限制文件读取目录 对输入参数进行白名单过滤 整体安全建议 更新框架到最新版本 定期进行安全审计 实施严格的输入验证机制