fasadmin 的lang接口任意文件读取漏洞(CVE-2024-7928)解决方案

今天网警来说lang接口存在漏洞.
我按网警说的的路径
/index/ajax/lang?lang=..//..//application/database
安装了最新版本的fastadmin后访问这个路径依然可以看到他说的那些信息.
之前按照修复方法修复过一次.
想问下是不是按这个路径访问就是可以看到这些信息.
下图是按路径访问看到的信息内容
1724730003939.jpg

这个是语言包接口,正常返回的就是语言包的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]);
        }

修改位置如图:
image.png

也可以直接使用以下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]);
    }
THE END