本次的漏洞研究基于thinkPHP开发开的一款项目.....
漏洞描述
Likeshop是Likeshop开源的一个社交商务策略的完整解决方案,开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞,该漏洞源于文件server/application/api/controller/File.php的参数file会导致不受限制的上传。
fofa查询语句
icon_hash="874152924" && body="/pc/"
环境搭建
下载https://github.com/likeshop-github/likeshop/releases/tag/2.5.7
漏洞代码审计
server\application\api\controller的File.php文件,路由/api/file/formimage
进入userFormImage方法,FileServer::userFormImages()
107行 创建实例StorageDriver 后调用setUploadFile方法,跟过去
其实调用的是引擎的setUplloadFile方法,是那个引擎呢!
分别为阿里云存储引擎 (OSS) 本地文件驱动 腾讯云存储引擎 (COS) 七牛云存储引擎 存储引擎抽象类(那三个全部继承这个类)
setUploadFile方法只在存储引擎抽象类中存在,因此分析server.php下的setUploadFile方法
我们重点关注上传文件名,文件内容。代码中没有任何过滤的函数,
查看109行 StorageDriver->upload 方法
我们挨个分析这几个引擎类对upload的实现
local类,直接move 没有任何过滤
Aliyun类
剩下的引擎类就不分析了,基本都没有做文件名的后缀检测。
文件上传漏洞可成功利用
后续修复
在修复的版本中,Server.php中进行了文件名的限制
这里校验文件处new了一个Upload对象,该对象内容如下
漏洞复现
进入环境页面设置好sql连接
等待安装
注册一个账号
登录账号后点击我的 设置自己信息
这里其实是有头像的,点击上传头像
抓包改变content-type 打入payload
实际测试没有cookie 没有token也可成功访问该接口
访问payload文件
payload成功执行 , 漏洞复现成功
附赠payload
POST /api/file/formimage HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: multipart/form-data; boundary=---------------------------348900489633202294591557761619
Content-Length: 248-----------------------------348900489633202294591557761619
Content-Disposition: form-data; name="file"; filename="b.php"
Content-Type: application/octet-stream<?php phpinfo(); ?>
-----------------------------348900489633202294591557761619--