ThinkPHP 3.2.3本身不内置文件上传功能,也无官方“上传文件类型绕过漏洞”;所谓绕过实为开发者误用I()、$_FILES及不安全后缀处理(如仅pathinfo提取、未统一转小写、依赖不可信MIME)所致,审计重点在于业务代码中上传流程的实现细节与存储路径解析风险。

确认上传入口点
在 Controller 层搜索典型关键词,定位上传逻辑:
- `$_FILES`、`move_uploaded_file`、`upload`、`file_put_contents`
- `I('file')`、`I('upload')`、`I('img')` 等常见参数名
- `saveAs`、`uploadOne`(部分项目会封装上传方法)
检查文件名与后缀处理逻辑
重点关注是否对用户可控的文件名/扩展名做了**可信校验**。常见危险模式包括:
- 仅用 `pathinfo($filename, PATHINFO_EXTENSION)` 提取后缀,但未过滤空字节、多点、大小写绕过(如
.pHp、.php.、.php%00.jpg) - 用 `str_replace` 或 `substr` 截断后缀,但未循环处理(如只删一次 `.php`,传入
shell.php.php可绕过) - 白名单校验写死在代码里(如
in_array($ext, ['jpg','png'])),但未统一转小写,导致.JPG被放行而后续解析器仍执行 - 依赖 MIME 类型(
$_FILES['file']['type'])判断 —— 完全不可信,客户端可任意伪造
验证存储路径与解析环境
即使后缀被限制,若文件存放在 Web 可访问目录且服务器配置不当,仍可能被解析执行:
- 检查上传后文件是否保存在 Application/、Public/ 或其他 Web 根目录下(如
./Uploads/、./images/) - 确认目标服务器是否开启 `.htaccess` 解析(Apache)或 fastcgi_split_path_info 配置(Nginx),是否存在
xxx.jpg/.php或xxx.jpg/php绕过可能 - 观察是否对文件内容做简单检测(如检查是否含
<?php),但未禁用短标签<?或 ASP 标签<%
结合 ThinkPHP 特性排查间接风险
某些看似无关的框架行为可能放大上传风险:
立即学习“PHP免费学习笔记(深入)”;
- 若上传文件名参与 模板渲染(如
$this->assign('filename', $name)+display()),可能触发模板引擎代码执行(尤其当TMPL_ENGINE_TYPE=php) - 若上传路径由 `I()` 获取并拼接到 `include/require` 中(如
include I('path').'),存在文件包含漏洞,可配合图片马利用 - 缓存目录(如
Runtime/Temp/)若被写入恶意缓存文件(见缓存 RCE 漏洞),再通过上传功能覆盖同名文件,可能复用攻击链



















