腾讯云网站解决方案帮您轻松应对建站成本高/网络不稳等常见问题

【漏洞预警】Discuz! 任意文件删除漏洞及漏洞分析

1
回复
1117
查看
[复制链接]

2

主题

3

帖子

30

积分

1°伸手党

Rank: 2

积分
30
发表于 19-4-18 11:18:55 | 显示全部楼层 |阅读模式         
   

Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的开源的社区论坛软件系统。采用 PHP 和 MySQL 构建的性能优异、功能全面的社区论坛平台。利用特殊构造的请求触发可参与文件删除操作,导致了任意文件删除漏洞的发生。早在2014年有白帽子向官方报告了一个类似的漏洞,但是由于没有修补全导致还有其他方式可以进行利用。

*由于Discuz官方暂未发布正式补丁及升级包,FreeBuf对漏洞细节暂不公开

影响范围

Discuz! X3.3

Discuz! X3.2

Discuz! X3.1

Discuz! X2.5

缓解措施

根据参考连接里的commit编辑upload/source/include/spacecp/spacecp_profile.php文件,删除和unlink相关代码。

0?wx_fmt=jpeg.jpg

参考

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

2 V' u6 u: Q  A7 Y6 G) v
【漏洞分析】Discuz!X ≤3.4 任意文件删除漏洞分析
4 o2 r2 Y# U) x+ h9 Q# l' {
0?wx_fmt=png.jpg ' q  n( \$ c! ~
% J2 R, z5 _0 Y  k5 u# [

0x01 简述


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

2017年9月29日,Discuz!修复了一个安全问题(https://gitee.com/ComsenzDiscuz/ ... ba654cf72aa42d3e574)用于加强安全性,这个漏洞会导致前台用户可以导致任意删除文件漏洞。

2017年9月29日,知道创宇404 实验室开始应急,经过知道创宇404实验室分析确认,该漏洞于2014年6月被提交到 Wooyun漏洞平台,Seebug漏洞平台收录了该漏洞,漏洞编号 ssvid-93588(https://www.seebug.org/vuldb/ssvid-93588)。该漏洞通过配置属性值,导致任意文件删除。

经过分析确认,原有的利用方式已经被修复,添加了对属性的 formtype 判断,但修复方式不完全导致可以绕过,通过模拟文件上传可以进入其他 unlink 条件,实现任意文件删除漏洞。


9 O( Z4 m2 H8 \! j' W8 v

0x02 复现


登陆DZ前台账户并在当前目录下新建 test.txt 用于测试

0?wx_fmt=png.jpg

请求

4 w/ K1 @6 {$ ]3 t. s! W! f- b
1+ s* A) d& @" {
2
2 n) y- M5 N6 S2 A
[size=1em]home.php?mod=spacecp&ac=profile&op=base
( G  B- Q4 A9 W[size=1em]POST birthprovince=../../../test.txt&profilesubmit=1&formhash=b644603b0 @8 N4 g$ Y' f- z

其中formhash为用户hash

修改成功之后出生地就会变为../../../test.txt

0?wx_fmt=png.jpg

构造请求向home.php?mod=spacecp&ac=profile&op=base上传文件(普通图片即可)

请求后文件被删除


4 K" F( Y5 j$ c, ^) E9 h

0x03 漏洞分析
% O! S; c( ^/ k2 V0 E* t7 {


Discuz!X 的码云已经更新修复了该漏洞

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

核心问题在upload/source/include/spacecp/spacecp_profile.php

0?wx_fmt=png.jpg

跟入代码70行

15 I& m- U0 o# W  K8 s1 B) `1 X
[size=1em]if(submitcheck('profilesubmit')) {
1 G8 }2 x3 L* f+ P

当提交 profilesubmit 时进入判断,跟入177行

0?wx_fmt=png.jpg

我们发现如果满足配置文件中某个 formtype 的类型为 file,我们就可以进入判断逻辑,这里我们尝试把配置输出出来看看

0?wx_fmt=png.jpg

我们发现formtype字段和条件不符,这里代码的逻辑已经走不进去了

我们接着看这次修复的改动,可以发现228行再次引入语句 unlink

1) O, x9 b) |$ Y$ T3 T
[size=1em]@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);! V" m! V# F9 G, L- Y! ?/ {

回溯进入条件

0?wx_fmt=png.jpg

当上传文件并上传成功,即可进入 unlink 语句

0?wx_fmt=png.jpg

然后回溯变量$space[$key],不难发现这就是用户的个人设置。

只要找到一个可以控制的变量即可,这里选择了 birthprovince。

在设置页面直接提交就可以绕过字段内容的限制了。

0?wx_fmt=png.jpg

成功实现了任意文件删除

" d- s) J# G; _. |' y6 n7 v

0x04 说在最后


在更新了代码改动之后,通过跟踪漏洞点逻辑,我们逐渐发现,该漏洞点在 2014 年被白帽子提交到 Wooyun平台上,漏洞编号wooyun-2014-065513。

由于DZ的旧版代码更新流程不完整,已经没办法找到对应的补丁了,回溯到 2013 年的 DZ3 版本中,我们发现了旧的漏洞代码

0?wx_fmt=png.jpg

在白帽子提出漏洞,可以通过设置个人设置来控制本来不可控制的变量,并提出了其中一种利用方式。

厂商仅对于白帽子的攻击 poc 进行了相应的修复,导致几年后漏洞再次爆出,dz 才彻底删除了这部分代码...

期间厂商对于安全问题的解决态度值得反思...

/ Q3 j* y! ?1 M2 A* U( y8 h

0x05 Reference


[1] Discuz!官网

http://www.discuz.net

[2] Discuz!更新补丁

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

[3] Seebug漏洞平台收录地址

https://www.seebug.org/vuldb/ssvid-93588

* j. `  ^% ?  q6 s7 q4 ^6 R
                : r6 Z2 U& Q/ O0 A$ H* |2 o
                    

0

主题

6

帖子

4

积分

1°伸手党

Rank: 2

积分
4
发表于 19-9-20 21:45:37 | 显示全部楼层         
支持一下
回复

使用道具 举报

网站简介

球球发,是一家 Discuz! 商业插件、风格模板、网站源码、 Discuz!运营维护技术等于一体的交流分享网站,全站95%的资源都是免费下载,对于资源我们是每天更新,每个亲测资源最新最全---球球发(如果我们有侵犯了您权益的资源请联系我们删除