Discuz!X任意文件删除漏洞的前世今生

2017年9月29日,Discuz!X修复了一个安全问题用于加强安全性,这个漏洞会导致前台用户可以任意删除文件。

综述

攻击难度:低。

危害程度:高。

官方修复情况如下:

https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574

什么是Discuz!X?

Discuz!X 社区软件,是一个采用PHP 和MySQL 等其他多种数据库构建的性能优异、功能全面、安全稳定的社区论坛平台,是全球市场占有率第一的社区论坛(BBS)。

它是一个以社区为基础的专业建站平台,让论坛(BBS)、社交网络(SNS)、门户(Portal)、群组(Group)、开放平台(Open Platform)应用充分融合于一体,帮助网站实现一站式服务。

影响的版本

  • 影响版本: ≤3.4

技术分析-前世

这个漏洞的分析我们先回到2014年6月19的一个漏洞。这个漏洞由白帽子提交到wooyun平台上,wooyun-2014-065513。

Discuz官方在这个补丁中修复了漏洞:

http://download.comsenz.com/DiscuzX/3.2/patch/DX32_R20140618_SC_UTF8.zip

我们下载修复之前的版本,可以在文件source/include/spacecp/spacecp_profile.php中,有如下代码:

这里的$_GET[‘deletefile’]没有经过任何处理,直接遍历他的$key和$value,然后将$space[$key]拼接到一个路径中,带入了系统函数unlink()删除此文件。

这里的$space[$key]是通过用户的uid获取的用户信息的一些字段:

我们来看一下当程序运行到上面拼接路径时,$space的具体内容:

$space是一个数组,里面存了所有当前用户属性信息的字段和内容。

那么,因为$_GET[‘deletefile’]是可控的,如果我们将$_GET[‘deletefile’]的$key设置为$space中存在字段,比如$space中存在一个用户基本信息的情感状态的字段affectivestatus,默认是空的,我们将$_GET[‘deletefile’]的$key设置成affectivestatus,那么拼接后就成了:

这个时候如果$space[‘affectivestatus’]的内容为一个路径的话那么就可以删除任意文件了。

现在漏洞就显而易见了,因为这个$space[‘affectivestatus’]的内容就是用户信息中的情感状况,我们提前先设置一下就ok了啊,设置成我们想删除的任意文件,比如../../../111111.txt:

第一步,我们先设置个人基本信息,将情感状况设置为你想删除的文件路径。

第二步,我们发送如下请求即可删除你设置的特定文件:

这里的formhash就是登陆后的一个token可以在页面源代码中看到,这个profilesubmit必须为true才能进行信息修改的操作,此时$key=affectivestatus,看看$space[‘affectivestatus’]的内容:

这个时候通过路径拼接就达到我们删除这个111111.txt的目的了,提交上述第二步的请求就可以删除根目录下的111111.txt了。

至于漏洞修复,官方应该采用了此漏洞提交者的建议:

简单的在漏洞存在的地方加了一个判断:

在删除之前判断要删除的内容的formtype是不是file类型,由于用户信息的字段的formtype都是非file类型的,所以修复后导致无法在此处删除文件了。

那么漏洞就真的修复了么???

技术分析-今生

三年后,在2017年9月29日,Discuz官方有修复了这个文件,通过对比分析补丁发现同样存在一个任意文件删除漏洞,漏洞原理和触发过程跟2014年的漏洞一模一样,我们来看看漏洞代码。

同样在文件source/include/spacecp/spacecp_profile.php中,有如下代码:

这里在上传文件的时候,如果上传成功,最后在倒数第二行代码里面:

也会进行一次删除操作,将$space[$key]拼接到路径后直接删除。

这里的$space前面已经分析过滤,这个$key就是上传文件是遍历$_FILES变量中的$key,再上传时同样没有处理$key的内容,所以也是可控的。

那么漏洞利用原理就是一样了,只不过是在提前设置好用户信息为路径外,第二步需要上传一个文件,让流程走到上传文件这里。

第一步,我们先设置个人基本信息,将情感状况设置为你想删除的文件路径。

第二步,我们修改一下页面属性为type=file,然后来上传一个文件:

点击保存后,程序就会走到上传的地方,然后第一步设置的../../../111111.txt文件就会被删掉。这时候的$key值:

这时候的$space[$key]=$space[‘affectivestatus’]的值:

大家可能注意到前面有很多if判断,这里需要注意上传的时候只能上传图片类型的文件,否则在:

这会判断不通过,导致continue,走不到下面的unlink。

至于漏洞修复,官方直接将此文件中的删除操作全部删除:

防护方案

请升级到官方的最新版即可。

参考链接

https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574

声 明

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技

绿盟科技(NSFOCUS Co., Ltd.)是中国网络安全领域的领导企业,致力于网络和系统安全问题的研究、高端网络安全产品的研发、销售与网络安全服务,在入侵检测/保护、远程评估、 DDoS攻击防护等方面提供具有国际竞争能力的先进产品,是国内最具安全服务经验的专业公司。有关绿盟科技的详情请参见: http://www.nsfocus.com

如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880

Spread the word. Share this post!

Meet The Author

Leave Comment