xiaoxiong's blog Thinking and Action

Discuz! X任意文件删除漏洞分析报告

2017-10-01

背景介绍

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

漏洞详情补充

有说删除discuzinstall.lock文件,再访问install/index.php能重装discuz,后台getshell,情况比较极端。说明:在discuz安装之后,第一次登陆后台管理页面admin.php的时候,会自动将install/index.php删除,有代码为证: admin页面部分代码admin.php页面中调用了admincp,而再admincp中删除了安装脚本install/index.php admincp_index.php页面部分代码 虽然无法用此方法getshell,但是漏洞风险依然很高!

修复建议

按照官方GIt更新,彻底删除spacecp_profile.php下unlink处代码

时间线

2017-09-29 Discuz官方更新

2017-09-30 360CERT完成后续报告

2017-10-01 完成补充并上传到个人博客

参考文档

  1. http://www.discuz.net/
  2. https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574
  3. wooyun-2014-065513
  4. https://cert.360.cn/report/detail?id=37b39434132113bd285fc004e765b245

Comments