thinkphp文件包含漏洞本质是开发者未校验用户可控路径参数,结合php伪协议可远程执行代码;常见于模板渲染、动态加载、日志读取环节,修复需关闭危险配置、白名单校验路径、禁用高危函数及web层拦截。

ThinkPHP 文件包含漏洞常与 PHP 伪协议结合利用,形成高危远程代码执行链。核心问题不在框架本身强制包含文件,而在于开发者未对用户可控的路径参数做严格校验,导致攻击者可拼接伪协议触发敏感操作。
漏洞常见触发点
主要集中在模板渲染、动态加载、日志读取等环节:
- 模板引擎中使用 assign() 传入用户控制的变量名,覆盖 _filename 导致模板路径被劫持
- 控制器中直接用 include/require 拼接 $_GET['file'] 或 $_POST['tpl'] 等参数
- 日志路径拼接不当(如 ./Runtime/Logs/Home/ . date('y_m_d') . '.log'),配合伪协议读取并解析日志内容
php://filter 与 php://input 的典型利用
当文件包含函数未禁用伪协议且 allow_url_include=On 时,以下方式可绕过简单后缀检查:
-
php://filter/read=convert.base64-encode/resource=:用于读取源码或配置文件,例如
?file=php://filter/read=convert.base64-encode/resource=config/database.php -
php://input:需配合 include() 使用,且请求体为合法 PHP 代码,例如 POST 数据为
<?php phpinfo();?>,URL 中含?file=php://input - data://text/plain,base64,PD9waHAgcGhwaW5mbygpOz8+:Base64 编码的 PHP 代码,绕过部分字符串黑名单
ThinkPHP 特有风险组合
在旧版本(如 5.0.22 前)中,攻击者常将伪协议与框架特性叠加利用:
- 通过 s=/index/think\app/invokefunction 触发函数调用,再传入 file_put_contents 写入 webshell 到临时目录
- 利用日志 RCE 链:先让恶意 payload 写入日志(如通过报错、调试信息),再用 php://filter 读取并 base64 解码执行
- 配合 auto_route 开启状态,暴力遍历控制器后,构造 think\template\driver\File::read() 路径跳转,最终包含伪协议资源
修复关键动作
不依赖单一补丁,需多层收敛:
- 关闭危险配置:allow_url_include=Off(php.ini)、auto_route=false、app_debug=false
- 所有文件路径参数必须白名单校验:只允许字母、数字、下划线、点号,禁止 ../、://、data:、php: 等协议标识
- 禁用高危函数:在 disable_functions 中加入 include, require, file_get_contents, highlight_file, show_source
- Web 服务器层拦截:Nginx 中添加规则,对 URL 或 body 中含 php://、data://、://filter 的请求统一返回 403
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











