thinkphp 6.0.1 模板注入漏洞核心风险在于 view() 函数路径拼接失控导致任意文件包含与代码执行,典型表现为 view(input('template')) 或 view('../uploads/shell.jpg') 等动态路径构造,配合上传功能可触发 rce。

ThinkPHP 6.0.1 中模板注入漏洞的核心风险点不在传统意义上的“模板引擎语法解析”,而在于 view() 函数路径拼接失控导致的任意文件包含,进而触发 PHP 代码执行——这在安全实践中被归类为“模板注入”的高危变种。识别它不依赖扫描器关键词匹配,而需聚焦开发者对模板路径的显式构造逻辑。
重点检查 view() 函数的动态路径拼接
模板注入在 TP6.0.1 中最典型的入口是 view() 被传入用户可控参数。需逐个排查控制器、中间件或公共方法中是否出现以下模式:
-
view(input('template'))、view($request->param('t'))等直接将请求参数作为模板名 -
view('index/' . input('page'))、view('admin/' . $action . '_form')等字符串拼接且未校验变量内容 - 调用
view()->fetch()时传入动态路径,尤其是含../、./或点号开头的变量
确认路径遍历是否可绕过防护
TP6.0.1 默认对模板路径做了基础限制,但业务代码可能显式关闭或绕过。需验证以下两点:
- 是否存在
view()->engine->layout(false)或view()->engine->options(['view_path' => ...])等手动配置,使路径校验失效 - 是否调用
view()->assign()后又使用fetch()加载非标准路径(如fetch('../runtime/logs/202610/access.log')) - 检查
config/template.php中'view_path'和'view_suffix'是否被动态修改,导致后缀校验形同虚设
关注上传文件与模板路径的交叉利用
单独的路径拼接未必能 RCE,但若配合文件上传功能,风险急剧放大。需同步审计:
- 是否允许用户上传图片等“安全”文件到
public/uploads/等可访问目录 - 上传后是否记录原始文件名或类型到数据库,并在后续
view()调用中回显(如view('uploaded/' . $dbRecord['filename'])) - 攻击者上传
shell.jpg.php或含 PHP 代码的 GIF 文件,再通过?template=../../uploads/shell.jpg触发解析执行
不要忽略 view() 的间接调用链
有些调用看似安全,实则隐藏风险。例如:
- 自定义标签或组件中调用
View::instance()->fetch(),且参数来自$this->attr['tpl']等标签属性 - 错误页面处理(如
app\common\exception\Handle.php)中使用view('error/' . $e->getCode()) - 多语言切换逻辑里拼接模板路径:
view('lang/' . session('lang') . '/index'),而session('lang')可被 Cookie 伪造
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











