thinkphp文件包含漏洞修复关键在堵路径拼接入口、过滤用户可控参数、限制加载范围,高发于多语言切换、模板渲染等模块,需关闭lang_switch_on、白名单校验lang值、禁用动态模板拼接、nginx拦截路径穿越及危险uri、禁用register_argc_argv与allow_url_include。

ThinkPHP文件包含漏洞修复,关键在堵住路径拼接入口、过滤用户可控参数、限制加载范围。这类漏洞常出现在多语言切换、模板渲染、日志加载等模块,攻击者通过构造lang=、template=、file=等参数,实现目录穿越或远程文件包含(RFI),甚至结合pearcmd.php触发RCE。
关闭多语言功能或严格校验lang参数
多语言功能是ThinkPHP中文件包含漏洞的高发区,尤其是lang参数未校验时,可被用于路径穿越(如lang=../../../../etc/passwd)或加载恶意PHP文件。
- 若业务无需多语言,直接在
config/app.php中设'lang_switch_on' => false,并删除Lang/目录下非必需语言包 - 若必须开启,需在
thinkphp/library/think/Lang.php的load()方法中,对传入的$lang值强制白名单校验:if (!in_array($lang, ['zh-cn', 'en-us', 'ja-jp'])) { throw new HttpException(400); } - 禁止
lang参数含../、./、\、:、?、#等路径敏感字符,可用str_replace(['..', '\', ':'], '', $lang)预处理(但仅作辅助,不能替代白名单)
模板与资源加载路径不可控时加约束
当使用fetch()、display()或vendor()等方法动态加载模板,且文件名来自用户输入(如$_GET['tpl']),极易引发本地文件包含(LFI)。
- 禁用模板名动态拼接:所有
fetch('xxx')中的xxx必须为硬编码字符串,不得拼接$_GET、$_POST等变量 - 若确需可配置模板路径,在
config/template.php中定义允许列表,例如:'allow_templates' => ['index', 'user/profile', 'admin/dashboard'],并在调用前校验:if (!in_array($tpl_name, config('template.allow_templates'))) { abort(404); } - 设置模板根目录为绝对路径,并确保
VIEW_PATH不指向Web可访问目录(如避免设为public/下)
Web服务器层拦截可疑文件加载行为
即使代码层有疏漏,Nginx/Apache也能作为最后一道防线,阻断典型文件包含特征请求。
- Nginx配置中加入:
location ~* .(php|html|htm|xml|txt|swf|css|js|jpg|jpeg|png|gif|ico|svg|woff|ttf|eot)$ {<br> try_files $uri =404;<br>}
防止通过/index.php?file=Runtime/Logs/26_08_17.log等方式直接下载日志 - 拒绝含路径穿越和危险函数调用的URI:
if ($args ~* "(lang=.*..|file=.*..|.php?.*call_user_func|.php?.*eval()") { return 403; } - 禁止访问
Runtime/、Conf/、Lang/等敏感目录:location ^~ /Runtime/ { deny all; }<br>location ^~ /Conf/ { deny all; }<br>location ^~ /Lang/ { deny all; }
禁用PHP危险配置与扩展(针对PEAR RCE场景)
当环境存在pearcmd.php且register_argc_argv=On时,攻击者可通过lang=../../../../usr/local/lib/php/pearcmd执行任意命令。
- 在
php.ini中设register_argc_argv = Off(重启PHP服务生效) - 若无运维权限,可在
public/index.php顶部添加:if (ini_get('register_argc_argv') && isset($_SERVER['argv'][1])) { die('Access denied'); } - 生产环境卸载PEAR扩展(
pecl uninstall pear)或删除/usr/local/lib/php/pearcmd.php文件(确认业务未依赖) - 检查
allow_url_include是否为Off,防止远程文件包含
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











