前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >lang接口任意文件读取漏洞(CVE-2024-7928)

lang接口任意文件读取漏洞(CVE-2024-7928)

作者头像
超级小可爱
发布2024-12-14 09:31:54
发布2024-12-14 09:31:54
25100
代码可运行
举报
文章被收录于专栏:小孟开发笔记小孟开发笔记
运行总次数:0
代码可运行

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

1724730003939.jpg
1724730003939.jpg

这个是语言包接口,正常返回的就是语言包的JSON数据,如果有特殊要求(例如参数错误直接返回错误),建议二次开发修改语言包lang接口,添加referer来源限制或以下代码来直接提示错误。

涉及以下两个文件:

代码语言:javascript
代码运行次数:0
复制
application/index/controller/Ajax.php
application/admin/controller/Ajax.php

lang方法内添加以下代码

代码语言:javascript
代码运行次数:0
复制
        $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
image.png

也可以直接使用以下lang方法直接替换上面两个文件中的lang方法,代码如下:

代码语言:javascript
代码运行次数:0
复制
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({});

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档