背景介绍
Discuz 官方于2017年9月29号在Git上提交更新:优化 加强安全性。360CERT跟进并验证了此漏洞,确认为严重漏洞。
漏洞概述
此漏洞曾在 2014 年被提交到乌云平台,Discuz 进行了针对性修复。但360CERT 通过对此次 commit 分析,发现之前的修复不完全,可导致补丁被bypass,攻击者可以将个人资料设置为删除文件路径,并构造图片上传,就可以绕过补丁造成任意文件删除。
漏洞攻击面影响
1.影响面
普通注册用户即可实现任意文件删除。经过 360CERT 研判后确认,漏洞风险等级为高。
2.影响版本
Discuz! X系列小于等于3.4
3.修复版本
码云平台 Discuz! X commit 7d603a197c2717ef1d7e9ba654cf72aa42d3e574
漏洞详情
if($_GET['deletefile'] && is_array($_GET['deletefile'])) {
foreach($_GET['deletefile'] as $key => $value) {
if(isset($_G['cache']['profilesetting'][$key]) && $_G['cache']['profilesetting'][$key]['formtype'] == 'file') {
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
@unlink(getglobal('setting/attachdir').'./profile/'.$verifyinfo['field'][$key]);
$verifyarr[$key] = $setarr[$key] = '';
}
}
}
可以看到在14年修复的打的补丁,使用$_G['cache']['profilesetting'][$key]['formtype'] == 'file'
对formtype
类型做了验证。
查看commit
,一共删除了五处unlink
文件删除函数,其中对228行unlink
函数做的限制最少
if($_FILES) {
$upload = new discuz_upload();
foreach($_FILES as $key => $file) {
......
if(!$upload->error()) {
$upload->save();
if(!$upload->get_image_info($attach['target'])) {
@unlink($attach['target']);
continue;
}
......
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
}
}
}
在spacecp_profile.php
里有文件上传处理函数,其中使用$upload->get_image_info($attach['target']
对上传文件进行检查,如果不是图片则continue
,所以需要上传为图片类型。
删除文件名为$space[$key]
,也没有进行安全处理
$space = getuserbyuid($_G['uid']);
space_merge($space, 'field_home');
space_merge($space, 'profile');
只需要在前一次提交数据对参数进行保存,比如真实姓名realname
处填写删除文件名../../../robots.txt
,数据库中的 realname
就会被保存为../../../robots.txt
,再上传图片,在资料保存中编辑html,添加<input type="file" name="filename">
就会触发并删除 robots.txt
。
漏洞详情补充
有说删除discuz
下install.lock
文件,再访问install/index.php
能重装discuz
,后台getshell
,情况比较极端。说明:在discuz
安装之后,第一次登陆后台管理页面admin.php
的时候,会自动将install/index.php
删除,有代码为证:
在admin.php
页面中调用了admincp
,而再admincp
中删除了安装脚本install/index.php
虽然无法用此方法getshell
,但是漏洞风险依然很高!
修复建议
按照官方GIt更新,彻底删除spacecp_profile.php
下unlink处代码
时间线
2017-09-29 Discuz官方更新
2017-09-30 360CERT完成后续报告
2017-10-01 完成补充并上传到个人博客
参考文档
- http://www.discuz.net/
- https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574
- wooyun-2014-065513
- https://cert.360.cn/report/detail?id=37b39434132113bd285fc004e765b245