fasadmin 的lang接口任意文件读取漏洞(CVE-2024-7928)解决方案
今天网警来说lang接口存在漏洞.
我按网警说的的路径
/index/ajax/lang?lang=..//..//application/database
安装了最新版本的fastadmin后访问这个路径依然可以看到他说的那些信息.
之前按照修复方法修复过一次.
想问下是不是按这个路径访问就是可以看到这些信息.
下图是按路径访问看到的信息内容
2、网友方案
这个是语言包接口,正常返回的就是语言包的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

0

打赏

分享

二维码

海报
1、官方公告--推荐
FastAdmin于2022年05月30日发布
V1.3.4.20220530
版本,其中包含重要的安全更新,由于旧版本对获取语言标识lang
的过滤不严可能导致安全问题,建议你立即进行更新和修复。受影响版本
查看你的FastAdmin版本请打开
application/config.php
底部可以查看到version
对应的版本号。受影响版本
FastAdmin版本
< 1.3.4.20220530
均需要更新修复温馨提示
FastAdmin版本位于
1.3.4.20220530
至1.5.1.20240903
之间的可能被误报,请参考链接https://ask.fastadmin.net/question/46696.html 进行优化修复方法
首先打开
application/common/behavior/Common.php
,添加以下代码public function appInit() { $allowLangList = Config::get('allow_lang_list') ?? ['zh-cn', 'en']; \think\Lang::setAllowLangList($allowLangList); }
如图:
然后打开
application/tags.php
,在app_init
对应的数组中添加以下代码'app\\common\\behavior\\Common',
如图:
备注:实际测试完成上述2步其实就堵住漏洞了,如果接着修改
Ajax.php文件会导致后台异常,建议只操作前2步即可
最后,修改以下两个文件:
application/index/controller/Ajax.php application/admin/controller/Ajax.php
再使用以下的
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]); }
历史安全更新
https://www.fastadmin.net/download.html#security
安全提示
安全不仅仅代码安全,同时还涉及到服务器安全等多方面,建议你配置好服务器相关安全配置,做好目录权限控制,以下是我们的安全建议:
application/config.php
中的cookie
配置中的httponly
设置为true
,如果是https
,建议secure
也配置为true
public
目录,同时启用open_basedir
限制只允许FastAdmin的根目录,例如:fastcgi_param PHP_VALUE "open_basedir=/var/www/fastadmin/:/tmp/:/proc/";
php.ini
,禁用不安全的函数,配置如disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru