实战讲解TP3框架下的渗透思路
字数 983 2025-08-20 18:18:40
ThinkPHP3框架渗透测试实战指南
1. ThinkPHP框架概述
ThinkPHP(TP)是一个开源免费的PHP开发框架,具有以下特点:
- 快速、简单的面向对象轻量级框架
- 遵循Apache2开源许可协议
- 国内主流PHP框架之一,学习成本低
1.1 主要版本及常见漏洞
- TP3:常见SQL注入漏洞
- TP5:常见远程代码执行(RCE)漏洞
- TP6:常见任意文件操作漏洞
2. 渗透测试前期准备
2.1 版本识别技巧
访问路径:xxx/index.php/index/任意字符
- 通常会返回无法找到控制器的报错信息
- 报错页面会显示框架版本信息(除非自定义了错误页面)
3. 实战案例1:SVN泄露→SQL注入→GetShell
3.1 SVN信息泄露利用
- 尝试访问
.SVN目录 - 使用工具下载源码:svnExploit
3.2 源码目录结构分析
├── Application # 应用目录(前后台)
│ ├── Admin # 后台
│ │ ├── Action # 控制器(重要)
│ ├── Home # 前台
│ │ ├── Action # 控制器(重要)
├── Public # 公开资源(js/css/images)
├── ThinkPHP # 框架核心文件
├── Uploads # 上传文件目录
├── index.php # 入口文件
3.3 SQL注入漏洞挖掘
- 检查登录功能代码
- 发现存在SQL注入的参数
- 构造Payload:
POST /Home/Login/checkLogin.html HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
extension=xxx&x[0]=exp&x[1]==(select*from(select+sleep(5)union/**/select+1)a)&password=xxxx
- SQLMap使用技巧:
- 需要对Payload进行简化处理:
extension=xxx&x[0]=exp&x[1]==(select from(*)a)&password=xxxx
3.4 GetShell方法
- 全局搜索
upload关键字 - 发现上传点代码:
public function uploadPic() {
if ($_FILES['pic']['error'] != 4) {
$image_name = time() . rand(1000, 9999) . "." . end(explode(".", $_FILES['pic']['name']));
move_uploaded_file($_FILES['pic']['tmp_name'], './Uploads/images/login_pic/' . $image_name);
$data['pic_path'] = "/Uploads/images/login_pic/" . $image_name;
$data['title'] = $_POST['title'];
$data['addtime'] = time();
M("login_pic")->add($data);
$this->success("上传成功");
} else {
$this->error("上传失败");
}
}
- 上传路径构造:
- 访问格式:
xxx/index.php/应用名称/控制器名/方法名 - 示例:
xxx/index.php/Admin/Manage/loginPic
- 上传后可通过数据库查询文件路径
4. 实战案例2:控制器方法Fuzz
4.1 未授权访问漏洞挖掘
- 对控制器方法进行Fuzz测试
- 常见路径格式:
xxx/index.php/Admin/Manage/loginPic - 可能发现未做权限控制的上传控制器
5. 渗透测试总结
-
信息收集:
- 识别框架版本
- 检查源码泄露(.SVN/.git)
-
漏洞挖掘:
- SQL注入:重点检查数据库操作点
- 文件上传:全局搜索upload关键字
- 未授权访问:Fuzz控制器和方法
-
权限提升:
- 通过低权限账号利用上传漏洞
- 利用数据库查询获取敏感信息
-
TP3框架特点:
- 常见于老旧系统
- SQL注入漏洞较多
- 权限控制不严格的情况常见
6. 防御建议
- 及时升级到最新版本
- 严格过滤用户输入
- 完善权限控制机制
- 禁用或保护版本信息泄露
- 定期进行安全审计
通过以上方法,可以系统性地对ThinkPHP3框架应用进行渗透测试,发现并利用常见安全漏洞。