作者:知道创宇404实验室
#### 0x01 简述
[Discuz!X](http://www.discuz.net "Discuz!X")社区软件,是一个采用 PHP 和 MySQL 等其他多种数据库构建的性能优异、功能全面、安全稳定的社区论坛平台。
2017年9月29日,[Discuz!修复了一个安全问题](https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574 "Discuz!修复了一个安全问题")用于加强安全性,这个漏洞会导致前台用户可以导致任意删除文件漏洞。
2017年9月29日,知道创宇404 实验室开始应急,经过知道创宇404实验室分析确认,该漏洞于2014年6月被提交到 Wooyun漏洞平台,Seebug漏洞平台收录了该[漏洞](https://www.seebug.org/vuldb/ssvid-93588 "漏洞"),漏洞编号 ssvid-93588。该漏洞通过配置属性值,导致任意文件删除。
经过分析确认,原有的利用方式已经被修复,添加了对属性的 formtype 判断,但修复方式不完全导致可以绕过,通过模拟文件上传可以进入其他 unlink 条件,实现任意文件删除漏洞。
#### 0x02 复现
登陆DZ前台账户并在当前目录下新建 test.txt 用于测试
![](https://images.seebug.org/content/images/2017/09/ef7f8e4b-4dbf-4ab8-ad74-dfc393c8d0ab.png-w331s)
![](https://images.seebug.org/content/images/2017/09/38383650-2615-4e9a-a9fd-0b2a781d5a98.png-w331s)
请求
```
home.php?mod=spacecp&ac=profile&op=base
POST birthprovince=../../../test.txt&profilesubmit=1&formhash=b644603b
其中formhash为用户hash
```
修改成功之后出生地就会变为../../../test.txt
![](https://images.seebug.org/content/images/2017/09/e71a5a6d-7ed8-4c57-a2b6-8e74df5426cb.png-w331s)
构造请求向`home.php?mod=spacecp&ac=profile&op=base`上传文件(普通图片即可)
请求后文件被删除
![](https://images.seebug.org/content/images/2017/09/502ff02b-79f7-4acb-a041-249a7c52fee9.png-w331s)
#### 0x03 漏洞分析
Discuz!X 的码云已经更新修复了该漏洞
[https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574](https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574)
核心问题在`upload/source/include/spacecp/spacecp_profile.php`
![](https://images.seebug.org/content/images/2017/09/ed2adcdb-6fc9-4775-b40e-b2fdf670f0d4.png-w331s)
跟入代码70行
```
if(submitcheck('profilesubmit')) {
```
当提交 profilesubmit 时进入判断,跟入177行
![](https://images.seebug.org/content/images/2017/09/caa844bc-c1e5-4d7b-8957-c10c7e7f9211.png-w331s)
我们发现如果满足配置文件中某个 formtype 的类型为 file,我们就可以进入判断逻辑,这里我们尝试把配置输出出来看看
![](https://images.seebug.org/content/images/2017/09/d12be812-8189-4ee5-a687-d5f64097cb51.png-w331s)
我们发现formtype字段和条件不符,这里代码的逻辑已经走不进去了
我们接着看这次修复的改动,可以发现228行再次引入语句 unlink
```
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
```
回溯进入条件
![](https://images.seebug.org/content/images/2017/09/78fc1d5b-ced4-44f3-9a20-1e2df44e1ea5.png-w331s)
当上传文件并上传成功,即可进入 unlink 语句
![](https://images.seebug.org/content/images/2017/09/ac32e531-4413-434e-8ab8-c72949474ad8.png-w331s)
然后回溯变量`$space[$key]`,不难发现这就是用户的个人设置。
只要找到一个可以控制的变量即可,这里选择了 birthprovince。
在设置页面直接提交就可以绕过字段内容的限制了。
![](https://images.seebug.org/content/images/2017/09/84a80e02-9428-491d-894c-1b9c0a8c1c8e.png-w331s)
成功实现了任意文件删除
#### 0x04 说在最后
在更新了代码改动之后,通过跟踪漏洞点逻辑,我们逐渐发现,该漏洞点在 2014 年被白帽子提交到 Wooyun平台上,漏洞编号wooyun-2014-065513。
由于DZ的旧版代码更新流程不完整,已经没办法找到对应的补丁了,回溯到 2013 年的 DZ3 版本中,我们发现了旧的漏洞代码
![](https://images.seebug.org/content/images/2017/09/ea9d8658-1a88-4e69-b63c-7c3034b1e137.png-w331s)
在白帽子提出漏洞,可以通过设置个人设置来控制本来不可控制的变量,并提出了其中一种利用方式。
厂商仅对于白帽子的攻击 poc 进行了相应的修复,导致几年后漏洞再次爆出,dz 才彻底删除了这部分代码...
期间厂商对于安全问题的解决态度值得反思...
#### 0x05 Reference
- [1] Discuz!官网
<http://www.discuz.net></http://www.discuz.net>
- [2] Discuz!更新补丁
<https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574></https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574>
- [3] Seebug漏洞平台收录地址
<https://www.seebug.org/vuldb/ssvid-93588></https://www.seebug.org/vuldb/ssvid-93588>
全部评论 (7)