PHP审计- TP3某二次开发程序
字数 1147 2025-08-22 12:23:47
ThinkPHP3 二次开发程序安全审计报告
1. 概述
本文档对某ThinkPHP3二次开发程序进行了详细的安全审计,发现了多个高危漏洞,包括任意文件上传和SQL注入漏洞。审计过程涵盖了漏洞发现、分析、验证和利用的全过程。
2. 环境准备
2.1 源码安装
- 创建数据库
- 导入数据库文件
- 更改数据库配置文件
3. 漏洞分析
3.1 后门文件发现
初步扫描发现以下可疑文件:
- 大马后门:
da.php - 多个图片马后门
3.2 任意文件上传漏洞
3.2.1 漏洞位置
handle_file_upload 方法
3.2.2 漏洞分析
-
方法参数:该方法有7个参数
-
文件处理流程:
- 创建空对象:
$file = new \stdClass() - 调用
get_file_name方法处理文件名 - 调用
trim_file_name方法进一步处理
- 创建空对象:
-
文件名处理细节:
trim_file_name方法:- 去除反斜杠
- 使用
basename获取文件名 - 使用
trim去除特殊字符 - 生成基于时间的文件名(将
.替换为-)
-
文件上传流程:
- 调用
get_unique_filename确保文件名唯一 - 调用
fix_integer_overflow检查文件大小 - 调用
get_upload_path获取上传路径 - 直接使用
move_uploaded_file移动文件
- 调用
-
关键问题:
- 无文件类型检查
- 无后缀名过滤
3.2.3 漏洞利用
构造HTML表单上传恶意文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form enctype="multipart/form-data"
action="http://127.0.0.1/Public/Inner/Js/uploader/server/php/index.php"
method="post">
<input type="file" name="files"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
上传成功后会返回文件路径,可直接获取Webshell。
3.3 SQL注入漏洞
3.3.1 漏洞位置
IndexController.class.php中的login方法
3.3.2 漏洞分析
-
输入处理:
- 使用TP3的
I方法获取name和pwd参数 - 直接拼接参数到SQL条件中
- 使用TP3的
-
数据库操作:
- 实例化User模型
- 使用
field获取全部字段 - 使用
where构建条件表达式 - 使用
find执行查询
-
关键问题:
- 无全局过滤
- 输入参数直接拼接到SQL语句
3.3.3 漏洞验证
使用SQLMap验证注入点:
POST /index.php?a=login&c=Index&m=Index HTTP/1.1
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Referer: http://192.168.7.154/
Cookie: PHPSESSID=pqim3lngnotf1p4sj15qurnef0
Content-Length: 97
Host: 192.168.7.154
device=0&name=*&pwd=d41d8cd98f00b204e9800998ecf8427e
4. 修复建议
4.1 任意文件上传漏洞修复
- 添加文件类型白名单检查
- 限制可上传文件扩展名
- 对上传文件进行重命名
- 设置文件大小限制
- 将上传目录设置为不可执行
4.2 SQL注入漏洞修复
- 使用预处理语句
- 对输入参数进行过滤
- 启用TP3的全局过滤机制
- 使用参数绑定方式构建查询
5. 总结
本次审计发现了两个高危漏洞,反映了开发过程中安全意识的不足。建议开发团队:
- 加强输入验证
- 实施最小权限原则
- 定期进行代码审计
- 建立安全开发规范
附录:漏洞验证截图
(此处可添加漏洞验证成功的截图)