CVE-2025-63888是ThinkPHP 5.0.24模板路径可控导致的RCE漏洞,修复需禁止view()接收动态路径、限制模板目录与后缀、禁用布局及危险函数、严格管控上传目录执行权限。

ThinkPHP 5.0.24 的模板文件读取漏洞(CVE-2025-63888)本质是缓存文件包含型远程代码执行(RCE),核心在于 view() 函数允许传入用户可控的、任意路径的模板名,导致攻击者可构造如 ../uploads/evil.jpg 这类路径,让框架加载并解析恶意图片中的 PHP 代码。
这个漏洞不是“打补丁”就能一劳永逸的——它暴露的是设计层面的风险:模板路径不应由用户输入决定。修复必须从使用方式和配置两方面入手。
禁止 view() 接收动态路径参数
所有调用 view() 的地方,必须确保第二个参数(或唯一参数)是硬编码的字符串字面量,不能拼接任何用户输入(GET/POST/路由变量等)。
-
✅ 正确写法:
立即学习“PHP免费学习笔记(深入)”;
return view('index'); // 固定模板名 return view('user/profile'); // 固定层级路径 -
❌ 危险写法(立即整改):
return view($_GET['tpl']); // 绝对禁止 return view($request->param('template')); // 绝对禁止 return view($userInput . '_page'); // 绝对禁止
检查项目中全部 view( 调用,用全局搜索 view( + $_ / input( / param( / $ 等关键词快速定位风险点。
严格限制模板目录与后缀
在 config/template.php 中显式约束模板加载范围:
return [
// 只允许从 template/ 目录下加载,禁止向上跳转
'view_path' => APP_PATH . 'view/',
// 强制只允许 .html 和 .php 模板(根据实际需要调整)
'view_suffix' => 'html',
// 关键:禁用不安全的布局开关和危险函数
'layout_on' => false, // 如非必需,关闭布局功能
'tpl_deny_func' => ['eval', 'assert', 'system', 'exec', 'shell_exec'],
];若项目未使用布局(layout),务必设 'layout_on' => false;已启用则需确认 layout_file 是固定路径,不可被覆盖。
清理并锁定所有用户上传目录
该漏洞常配合上传功能利用(如把恶意 PHP 写进 .jpg 文件再通过 view() 加载)。必须做到:
-
所有上传目录(如
public/uploads/、public/attach/)在 Web 服务器层面禁止执行 PHP:
Nginx 示例:location ~ ^/uploads/.*\.(php|phtml|php3|php4|php5|php7|php8|phar|cgi|pl|py|jsp|asp|sh|exe)$ { deny all; } 上传后的文件强制重命名(去掉原始扩展名),并校验 MIME 类型与内容(如用
getimagesize()验证图片)。不要将上传目录放在
runtime/或app/等敏感路径下,避免路径穿越时直接命中框架核心。
验证是否修复成功
手工验证两个关键点:
- 访问类似
/index/index?template=../runtime/log/202610/27.log的 URL,应返回 404 或空内容,绝不能输出日志明文; - 尝试用
view('../public/uploads/test.jpg')加载含<?php phpinfo(); ?>的图片,页面应报错(如Template not exists)或直接空白,不能执行 phpinfo。
不复杂但容易忽略。



















