thinkphp多语言功能本地文件包含漏洞影响5.0.0至5.0.23版本以及5.1.0至5.1.31版本。该漏洞源于框架在解析多语言文件路径时未对输入进行严格过滤,攻击者可通过构造包含`../`的恶意请求,读取服务器上的任意本地文件。

lang()函数如何处理多语言文件路径
当调用lang()函数并传入带有目录遍历字符的路径时,系统会直接将其拼接到多语言文件的存储目录下,而不进行任何安全检查。这意味着如果用户可控的输入被直接用于构建文件路径,攻击者就可以利用这一点访问非预期的文件。

public function lang($name = '', $vars = [], $lang = '')
{
// ... 省略部分代码 ...
if (is_file($filename)) {
include $filename;
}
// ... 省略部分代码 ...
}
上述代码展示了lang()函数的核心逻辑。可以看到,在确定$filename后,程序直接使用include语句加载该文件。由于$filename的值可能受到用户输入的影响,且缺乏有效的路径校验,导致了本地文件包含漏洞的产生。
立即学习“PHP免费学习笔记(深入)”;
为跨境电子商务生成多语言、SEO 优化的产品描述。支持英语、西班牙语、俄语和阿拉伯语,并针对不同搜索引擎(Google / Bing、Yandex、中东市场)进行专项 SEO 优化。适用于以下场景:用户需为国际市场创建符合 SEO 规范的产品文案、批量生成产品描述,或针对特定搜索引擎及区域用户偏好优化内容。
如何验证该漏洞的存在
要验证此漏洞,可以尝试向支持多语言的接口发送一个包含../../etc/passwd的请求。如果服务器返回了/etc/passwd文件的内容,则说明存在漏洞。例如,通过访问?lang=../../etc/passwd这样的URL参数,可以触发漏洞。

// 假设有一个控制器方法
public function testLang()
{
$lang = input('get.lang');
echo lang($lang);
}
以上是一个简单的控制器示例,其中input('get.lang')获取用户传入的lang参数,并传递给lang()函数。如果lang参数的值为../../etc/passwd,则可能导致/etc/passwd文件被包含并执行。
升级或修复建议是什么
对于受影响的版本,建议尽快升级到最新的安全版本。如果无法立即升级,可以通过自定义lang()函数来增加路径校验逻辑,确保只允许访问预期的多语言文件目录下的文件。此外,还可以考虑使用白名单机制,限制可加载的多语言文件名称。


















