记一次渗透测试
字数 1370 2025-08-26 22:11:57
ThinkPHP 3.2.3 渗透测试实战分析
0x01 信息收集阶段
URL结构分析
- 初始URL:
http://www.*.com/index.php/Home/News/lists/c_id/12.html - 通过修改URL路径识别框架:
- 修改为:
http://www.*.com/index.php/User/News/lists/c_id/12.html - 确认目标使用ThinkPHP框架,版本3.2.3
- 修改为:
目录探测技巧
-
日志文件探测:
- ThinkPHP通常将日志存储在
runtime目录 - 尝试访问
/runtime目录,但目标不存在此目录
- ThinkPHP通常将日志存储在
-
后台路径猜测:
- ThinkPHP单入口模式下,可直接在
index.php后加admin尝试访问后台 - 成功发现后台路径:
http://www.*.com/index.php/admin
- ThinkPHP单入口模式下,可直接在
0x02 代码审计阶段
框架结构分析
- 后台控制器继承两类:
AuthController: 需要身份认证Controller: 无需认证
重点审计目标
寻找继承Controller的控制器文件:
- login.php
- Ajax.php
- Dep.php
- Empty.php
漏洞发现
在AjaxController.class.php中发现无条件SQL注入漏洞:
public function getRegion(){
$Region=M("region");
$map['pid']=$_REQUEST["pid"]; // 直接使用用户输入,未过滤
$map['type']=$_REQUEST["type"]; // 直接使用用户输入,未过滤
$list=$Region->where($map)->select();
echo json_encode($list);
}
漏洞特征:
- 直接使用
$_REQUEST获取参数 - 未进行任何过滤直接拼接到SQL查询
- 返回JSON格式数据
0x03 漏洞利用
SQL注入利用
- 确认目标无WAF防护
- 可直接使用sqlmap进行自动化注入:
sqlmap -u "http://www.*.com/index.php/Ajax/getRegion?pid=1&type=1" --technique=B --dbms=mysql
0x04 提权与Getshell
环境信息
- 服务器环境: PHP + IIS7.5
利用思路
-
上传点寻找:
- 寻找任意图片上传功能
- 通过修改文件扩展名或内容绕过限制
-
解析漏洞利用:
- 利用IIS7.5 + FastCGI解析漏洞
- 典型payload: 上传
.php文件,访问时附加/.jpg后缀使IIS以PHP解析
0x05 防御建议
针对ThinkPHP开发
-
输入过滤:
- 所有用户输入必须经过过滤
- 使用框架提供的
I()函数进行安全过滤
-
安全配置:
- 关闭调试模式
- 设置
APP_DEBUG为false - 限制日志目录访问
-
权限控制:
- 所有业务控制器应继承需要认证的基类
- 严格区分前后台权限
针对服务器配置
-
WAF部署:
- 部署Web应用防火墙
- 过滤常见攻击payload
-
上传限制:
- 严格限制上传文件类型
- 使用文件内容检测而非扩展名判断
-
解析安全:
- 更新IIS和FastCGI到最新版本
- 配置正确的处理器映射
附录:渗透测试检查清单
-
ThinkPHP特征检查:
- [ ] 检查URL路由模式
- [ ] 探测
/index.php?s=/模块/控制器/方法形式URL - [ ] 检查
/runtime日志目录
-
后台路径探测:
- [ ]
/admin - [ ]
/manage - [ ]
/backend
- [ ]
-
常见漏洞检查:
- [ ] 未过滤的
$_GET/$_POST/$_REQUEST使用 - [ ] 继承无认证控制器的业务逻辑
- [ ] 任意文件上传点
- [ ] 未过滤的
-
环境漏洞检查:
- [ ] IIS解析漏洞
- [ ] FastCGI配置问题
- [ ] 目录遍历漏洞