暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Typesetter CMS任意文件上传漏洞分析

启明星辰金睛安全研究团队 2020-12-01
1442

漏洞描述

Typesetter CMS 5.x-5.1版本中,可以在后台上传模块通过上传包含php的zip文件绕过后缀白名单,执行任意php代码并获取目标权限。漏洞形成原因主要是typesetter管理后台支持zip解压,而zip后缀又在上传白名单中,因此导致任意文件上传。官方给出的漏洞详情介绍请参考:https://github.com/Typesetter/Typesetter/issues/674。下面是利用Fofa搜索该漏洞影响范围。


漏洞复现

Typesetter CMS 5.1版本下载地址:https://github.com/Typesetter/Typesetter/

将源码下载后解压在web目录下,漏洞位于/admin/uploaded,将php文件生成压缩文件且后缀为.php.zip,右键上传解压该zip文件,打开后即可获得php文件地址。


漏洞分析

利用burp对上传过程抓包分析,发现上传接口为Admin_Finder,可以发现并且相关参数和参数的值,$cmd的值为upload,$filename的值就是我们上传的文件名。

打开上传接口类Finder源码调试,在浏览器上传test.php.zip文件,在phpstrom调试查看,重点代码是这一段,$listeners的值是upload_check赋给$listener并且通过call_user_func函数调用upload_check函数,下面我们需要去看upload_check函数。

uploaded.php文件源码内容只有两个类,一个Uploaded类,还有其子类admin_uoloaded, upload_check函数就在Uploaded类里,将$args[‘FILES’][‘upload’]的值赋给$file,$args[‘FILES’][‘upload’]中存放的正是我们上传文件的名称、类型的信息,若$file不为数组则直接return,若为数组则判断$file中的name变量每一项是否符合AllowedExtension。

下面我们跟进AllowedExtension,函数的作用是判断后缀是否在白名单内,如果后缀不满足白名单则拒绝上传,因此我们只能上传白名单内的,zip是在白名单中的。

但如果我们不让他们进入AllowedExtension去判断后缀,是不是就可以绕过?那么就涉及到上面的代码,如果$file不为数组则return那么就结束了整个函数,就不会进入AllowedExtension,可是后面的调试过程中发现,若$file不为数组那么在最后的上传过程中,无法获取文件名和类型来发包给服务器,也没法完成上传动作,所以无法利用。
执行完upload_check函数后又利用call_user_func调用了upload函数,因为$cmd的值upload。

upload函数就是标准的上传行为,至此上传已完成,最后将结果存入$data数据以json格式输出,我们在上面的burp返回包中就可以看到$data中的内容。

文章转载自启明星辰金睛安全研究团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论