fasadmin 的lang接口任意文件读取漏洞(CVE-2024-7928)解决方案
今天网警来说lang接口存在漏洞.
我按网警说的的路径
/index/ajax/lang?lang=..//..//application/database
安装了最新版本的fastadmin后访问这个路径依然可以看到他说的那些信息.
之前按照修复方法修复过一次.
想问下是不是按这个路径访问就是可以看到这些信息.
下图是按路径访问看到的信息内容
这个是语言包接口,正常返回的就是语言包的JSON
数据,如果有特殊要求(例如参数错误直接返回错误),建议二次开发修改语言包lang
接口,添加referer
来源限制或以下代码来直接提示错误。
涉及以下两个文件:
application/index/controller/Ajax.php
application/admin/controller/Ajax.php
在lang
方法内添加以下代码
$controllername = $this->request->get('controllername');
$lang = $this->request->get('lang');
if (!$lang || !in_array($lang, config('allow_lang_list')) || !$controllername || !preg_match("/^[a-z0-9\.]+$/i", $controllername)) {
return jsonp(['errmsg' => '参数错误'], 200, [], ['json_encode_param' => JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE]);
}
修改位置如图:
也可以直接使用以下lang
方法直接替换上面两个文件中的lang
方法,代码如下:
public function lang()
{
$this->request->get(['callback' => 'define']);
$header = ['Content-Type' => 'application/javascript'];
if (!config('app_debug')) {
$offset = 30 * 60 * 60 * 24; // 缓存一个月
$header['Cache-Control'] = 'public';
$header['Pragma'] = 'cache';
$header['Expires'] = gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
}
$controllername = $this->request->get('controllername');
$lang = $this->request->get('lang');
if (!$lang || !in_array($lang, config('allow_lang_list')) || !$controllername || !preg_match("/^[a-z0-9_\.]+$/i", $controllername)) {
return jsonp(['errmsg' => '参数错误'], 200, [], ['json_encode_param' => JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE]);
}
$controllername = input("controllername");
$className = \think\Loader::parseClass($this->request->module(), 'controller', $controllername, false);
//存在对应的类才加载
if (class_exists($className)) {
$this->loadlang($controllername);
}
//强制输出JSON Object
return jsonp(Lang::get(), 200, $header, ['json_encode_param' => JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE]);
}
版权声明:
作者:admin
链接:http://blog.mryxh.cn/3963.html
文章版权归作者所有,未经允许请勿转载。
THE END