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

在分析的已经有的cve的过程中,发现了zzcms 8.3对比之前版本的功能上改进,于是顺便跟进看一下,有没有什么问题,果然发现了问题。

 

CMS中有关文件存储的实现

因为我自己也做过类似cms的很多项目,所以在这个地方也比较敏感。
一般我实现文件存储的几个习惯:

  1. 统一文件夹存放
  2. 数据库记录存储路径
  3. 对于入库记录进行严格的防注入和文件上传检测,采用白名单方式来检查后缀,黑名单过滤上跳等操作,严格做到数据库与文件同步
  4. 能用云存储就用,实在不能用在自己写
  5. 尽量少的使用文件删除功能

 

zzcms中采用的方式存在的问题

核心-差异的产生

首先是入库的位置,用户在上传自己头像的时候,是通过弹出小窗来实现的,默认储存文件文件夹是/uploadfiles/Y-m/:
而且这里是允许使用网络图片的:
但是有一点做的比较不好,就是在这个页面的交互以后,是通过js的callback,回调给了ckeditor,最后的地址可以直接抓包看到,并且修改。
这就导致了实际文件夹中的文件会和数据库中的文件不一样,导致了差异的产生,其实这就和orange大佬,在Black Hat USA 2018和DEFCON 26上讲过的很像,不过这里是很浅显易懂的。
总结一下zzcms的实现方式:

  1. 统一文件夹存放
  2. 数据库记录存储路径
  3. 没有做到文件与数据库同步,过于相信了用户的输入

过滤不严格

按照上面的分析,数据库和实际文件会产生差异,然后来看一下zzcms的有关文件操作部分:

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

实现文件删除的方式

系统中在删除某个信息的时候,是会删除有关的文件的,或者是更改信息的时候,也是会删除原来数据库中存的文件路径,这两个都可能会导致任意文件删除。

可以说是只要有这段代码的地方,都可以产生这个漏洞,而这个问题的核心就是前面写到的差异化的产生。

发现新添加业务的问题

经过简单的观察,8.3版本对比8.2版本,添加了一个介绍视频的功能,但是这个功能需要管理员主动开启,并且需要用户开通高级用户特权才可以使用,但是这里也是存在问题的:
有关视频的变量主要是$flv:
可以看到处理流程和之前的img是一样的,所以也是可能存在问题的,经过简单测试发现是可行的,下面简单写一下攻击步骤:

  1. 管理员开启插入视频开关:
  2. 在发布信息的时候,同样使用网络地址,然后抓包,将flv改成要删除的文件名,点击发送,脏数据就放到了数据库中:
    3.然后同样在删除的页面,只要发送id和tablename就可以触发删除操作:
    4.刷新页面,就可以看到我们上面写的/install/install.lock文件被删除了:

 

修复建议

因为产生漏洞的核心点是在上传文件的时候,采用的js callback回传的消息,然后在采用提交字符串的形式插入数据库,这中间数据的篡改。所以修复的关键点就在了这里,而且涉及到了数据库的设计问题,下面详细写一下:

  1. 将文件路径的有关存储分离出来,单独做个表。
  2. 在用小窗上传文件的时候,做到存储文件并且插入数据库,返回文件编号id
  3. 用户传入广告信息的时候,只传入文件id,作为外键,检查文件是否是该用户传入的,然后正常返回

画个图容易理解:

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

(完)