记一次对Tp二开的源码审计(Php审计)
字数 1469 2025-08-05 19:10:09

ThinkPHP 3.2.3 二次开发源码审计报告

概述

本文档详细分析了ThinkPHP 3.2.3二次开发系统中存在的多个安全漏洞,包括任意文件包含代码执行、SQL注入和Session操控等问题。审计过程中采用了框架版本确认、路由检查、核心类审计等方法。

审计方法

  1. 确认系统版本:首先确定使用的是ThinkPHP 3.2.3框架
  2. 路由检查:确认路由是默认配置还是经过修改
  3. 核心类审计:重点检查web类中的代码实现
  4. 历史漏洞参考:结合ThinkPHP 3.2.3已知漏洞进行针对性审计

发现的安全漏洞

1. 任意文件包含导致代码执行

文件位置Application/Home/Controller/VueController.class.php

漏洞代码

public function _empty($methed_name){
    $this->display($methed_name);
    exit(0);
}

漏洞分析

  • display方法会直接包含传入的文件
  • 当调用不存在的控制器方法时,会触发_empty方法
  • 攻击者可以通过构造特殊的methed_name参数包含任意文件

利用方式

  • 构造请求使methed_name参数指向日志文件等包含PHP代码的文件
  • 例如包含日志文件路径实现代码执行

修复建议

  • methed_name参数进行严格过滤
  • 限制只能包含特定目录下的模板文件
  • display方法改为protected访问权限

2. SQL注入漏洞

文件位置Application/Api/Controller/AreaController.class.php

漏洞代码

public function ajax() {
    $pid = $_REQUEST['pid'];
    $list = D('Area')->where(array('pid'=>$pid))->select();
    // ...
}

漏洞分析

  • 直接使用$_REQUEST['pid']获取参数,未使用框架的I方法进行过滤
  • 允许构造Exp表达式用于Where条件
  • 攻击者可以构造特殊参数实现SQL注入

利用方式

pid[0]=exp&pid[1]= and updatexml(1,concat(0x7e,(select user())),0)

修复建议

  • 使用框架提供的I方法获取并过滤输入参数
  • 对数组参数进行类型检查
  • 使用参数化查询或预处理语句

3. Session操控漏洞

文件位置Application/Api/Controller/CodePayController.class.php

漏洞代码

public function setsession() {
    $key = (isset($_REQUEST['key']) && !empty($_REQUEST['key'])) ? $_REQUEST['key'] : '';
    $value = (isset($_REQUEST['value']) && !empty($_REQUEST['value'])) ? $_REQUEST['value'] : '';
    session($key,$value);
}

漏洞分析

  • 允许通过请求参数直接设置任意Session键值
  • 结合不严格的登录检查,可导致未授权访问
  • 攻击者可以伪造用户Session实现权限提升

登录检查代码

function check_login(){
    if (!empty($_SESSION['user']['id'])){
        return true;
    }else{
        return false;
    }
}

修复建议

  • 移除直接设置Session的接口
  • 如果需要设置Session,应限制可设置的key范围
  • 增加CSRF防护
  • 加强登录检查逻辑

其他潜在风险

Display方法公开调用风险

文件位置ThinkPHP/Library/Think/Controller.class.php

风险描述

  • 如果display方法被改为public访问权限
  • 攻击者可能从前台控制器直接调用display方法
  • 导致任意代码执行风险

修复建议

  • 保持display方法为protected访问权限
  • 对模板文件包含路径进行严格校验

总结与建议

  1. 框架升级:建议升级到ThinkPHP最新版本,修复已知漏洞
  2. 输入过滤:统一使用框架提供的I方法获取输入参数
  3. 权限控制:严格检查控制器方法的访问权限
  4. Session安全:避免直接通过请求参数设置Session
  5. 代码审计:定期进行安全审计,特别是自定义控制器和方法
  6. 日志监控:对可疑操作进行日志记录和监控

通过本次审计发现,二次开发系统往往因为开发人员安全意识不足或对框架机制理解不深而引入安全风险。建议开发团队加强安全培训,建立代码审查机制,确保系统安全性。

ThinkPHP 3.2.3 二次开发源码审计报告 概述 本文档详细分析了ThinkPHP 3.2.3二次开发系统中存在的多个安全漏洞,包括任意文件包含代码执行、SQL注入和Session操控等问题。审计过程中采用了框架版本确认、路由检查、核心类审计等方法。 审计方法 确认系统版本 :首先确定使用的是ThinkPHP 3.2.3框架 路由检查 :确认路由是默认配置还是经过修改 核心类审计 :重点检查web类中的代码实现 历史漏洞参考 :结合ThinkPHP 3.2.3已知漏洞进行针对性审计 发现的安全漏洞 1. 任意文件包含导致代码执行 文件位置 : Application/Home/Controller/VueController.class.php 漏洞代码 : 漏洞分析 : display 方法会直接包含传入的文件 当调用不存在的控制器方法时,会触发 _empty 方法 攻击者可以通过构造特殊的 methed_name 参数包含任意文件 利用方式 : 构造请求使 methed_name 参数指向日志文件等包含PHP代码的文件 例如包含日志文件路径实现代码执行 修复建议 : 对 methed_name 参数进行严格过滤 限制只能包含特定目录下的模板文件 将 display 方法改为protected访问权限 2. SQL注入漏洞 文件位置 : Application/Api/Controller/AreaController.class.php 漏洞代码 : 漏洞分析 : 直接使用 $_REQUEST['pid'] 获取参数,未使用框架的 I 方法进行过滤 允许构造Exp表达式用于Where条件 攻击者可以构造特殊参数实现SQL注入 利用方式 : 修复建议 : 使用框架提供的 I 方法获取并过滤输入参数 对数组参数进行类型检查 使用参数化查询或预处理语句 3. Session操控漏洞 文件位置 : Application/Api/Controller/CodePayController.class.php 漏洞代码 : 漏洞分析 : 允许通过请求参数直接设置任意Session键值 结合不严格的登录检查,可导致未授权访问 攻击者可以伪造用户Session实现权限提升 登录检查代码 : 修复建议 : 移除直接设置Session的接口 如果需要设置Session,应限制可设置的key范围 增加CSRF防护 加强登录检查逻辑 其他潜在风险 Display方法公开调用风险 文件位置 : ThinkPHP/Library/Think/Controller.class.php 风险描述 : 如果 display 方法被改为public访问权限 攻击者可能从前台控制器直接调用 display 方法 导致任意代码执行风险 修复建议 : 保持 display 方法为protected访问权限 对模板文件包含路径进行严格校验 总结与建议 框架升级 :建议升级到ThinkPHP最新版本,修复已知漏洞 输入过滤 :统一使用框架提供的 I 方法获取输入参数 权限控制 :严格检查控制器方法的访问权限 Session安全 :避免直接通过请求参数设置Session 代码审计 :定期进行安全审计,特别是自定义控制器和方法 日志监控 :对可疑操作进行日志记录和监控 通过本次审计发现,二次开发系统往往因为开发人员安全意识不足或对框架机制理解不深而引入安全风险。建议开发团队加强安全培训,建立代码审查机制,确保系统安全性。