欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

zzcms 8.3 任意文件删除漏洞深入思考

来源:本站整理 作者:佚名 时间:2018-08-21 TAG: 我要投稿

在分析的已经有的cve的过程中,发现了zzcms 8.3对比之前版本的功能上改进,于是顺便跟进看一下,有没有什么问题,果然发现了问题。
 
CMS中有关文件存储的实现
因为我自己也做过类似cms的很多项目,所以在这个地方也比较敏感。一般我实现文件存储的几个习惯:
统一文件夹存放
数据库记录存储路径
对于入库记录进行严格的防注入和文件上传检测,采用白名单方式来检查后缀,黑名单过滤上跳等操作,严格做到数据库与文件同步
能用云存储就用,实在不能用在自己写
尽量少的使用文件删除功能
 
zzcms中采用的方式存在的问题
核心-差异的产生
首先是入库的位置,用户在上传自己头像的时候,是通过弹出小窗来实现的,默认储存文件文件夹是/uploadfiles/Y-m/:

而且这里是允许使用网络图片的:

但是有一点做的比较不好,就是在这个页面的交互以后,是通过js的callback,回调给了ckeditor,最后的地址可以直接抓包看到,并且修改。

这就导致了实际文件夹中的文件会和数据库中的文件不一样,导致了差异的产生,其实这就和orange大佬,在Black Hat USA 2018和DEFCON 26上讲过的很像,不过这里是很浅显易懂的。总结一下zzcms的实现方式:
统一文件夹存放
数据库记录存储路径
没有做到文件与数据库同步,过于相信了用户的输入
过滤不严格
按照上面的分析,数据库和实际文件会产生差异,然后来看一下zzcms的有关文件操作部分:

这段代码在系统中很常见,可以看到实际操作文件的时候,还是以数据库中为准的,并且没有进行有效的过滤,所以前面造成的差异是能直接影响到文件操作的。有关已经存在的几个任意文件删除漏洞,可以查看我之前在发的文章。zzcms v8.2 中的众多cve分析和zzcms 8.3 最新CVE漏洞分析.其中的大部分都是这里产生的问题
实现文件删除的方式
系统中在删除某个信息的时候,是会删除有关的文件的,或者是更改信息的时候,也是会删除原来数据库中存的文件路径,这两个都可能会导致任意文件删除。

可以说是只要有这段代码的地方,都可以产生这个漏洞,而这个问题的核心就是前面写到的差异化的产生。
发现新添加业务的问题
经过简单的观察,8.3版本对比8.2版本,添加了一个介绍视频的功能,但是这个功能需要管理员主动开启,并且需要用户开通高级用户特权才可以使用,但是这里也是存在问题的:有关视频的变量主要是$flv:

可以看到处理流程和之前的img是一样的,所以也是可能存在问题的,经过简单测试发现是可行的,下面简单写一下攻击步骤:
管理员开启插入视频开关:

在发布信息的时候,同样使用网络地址,然后抓包,将flv改成要删除的文件名,点击发送,脏数据就放到了数据库中:

3.然后同样在删除的页面,只要发送id和tablename就可以触发删除操作:

4.刷新页面,就可以看到我们上面写的/install/install.lock文件被删除了:

 
修复建议
因为产生漏洞的核心点是在上传文件的时候,采用的js callback回传的消息,然后在采用提交字符串的形式插入数据库,这中间数据的篡改。所以修复的关键点就在了这里,而且涉及到了数据库的设计问题,下面详细写一下:
将文件路径的有关存储分离出来,单独做个表。
在用小窗上传文件的时候,做到存储文件并且插入数据库,返回文件编号id
用户传入广告信息的时候,只传入文件id,作为外键,检查文件是否是该用户传入的,然后正常返回
画个图容易理解:

这样就能有效防止任意文件删除漏洞的产生了。当然这也只是我自己结合自己的一些经验提出的,如果有大佬有更好的解决方案,也欢迎大佬指教哈!
 

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载