今天网警来说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]);
}
亲测可行!
实测改了之后也不影响语言包的加载和使用,漏洞也完美堵上了,据说lang 漏洞 2022 年已经修复
新版的我测试获取到的是乱码,这个估计不需要在处理了
(adsbygoogle = window.adsbygoogle || []).push({});