当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0195162

漏洞标题:dzzoffice任意文件包含下载(需要登录)

相关厂商:dzzoffice

漏洞作者: 路人甲

提交时间:2016-04-12 13:13

修复时间:2016-07-11 17:50

公开时间:2016-07-11 17:50

漏洞类型:任意文件遍历/下载

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-04-12: 细节已通知厂商并且等待厂商处理中
2016-04-12: 厂商已经确认,细节仅向厂商公开
2016-04-15: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-06-06: 细节向核心白帽子及相关领域专家公开
2016-06-16: 细节向普通白帽子公开
2016-06-26: 细节向实习白帽子公开
2016-07-11: 细节向公众公开

简要描述:

rt...

详细说明:

任意文件包含漏洞
问题文件在dzz/system/save.php之中

}elseif($_GET['do']=='move'){


当是move方法的时候
从115行开始看

if($sourcetype=='icoid'){//是ico时
$data=array();
$totalsize=0;
$data['gid']=$gid;
$data['iscopy']=$iscopy;
$icos=$folderids=array();
//分4种情况:a:本地到api;b:api到api;c:api到本地;d:本地到本地;
foreach($icoids as $icoid){
//在目标位置创建
$opath=rawurldecode($icoid);
$path=rawurldecode(str_replace(array('_dock_','icosContainer_folder_','icosContainer_body_'),'',$container));
$return=IO::CopyTo($opath,$path,$iscopy);
//调用了IO类的CopyTo方法
if(!$iscopy && !$return['moved']){
$return = IO::DeleteByData($return);
}
if($return['success']===true){
$data['icoarr'][]=$return['newdata'];
if(!$tbz){
addtoconfig($return['newdata'],$ticoid);
}
if($return['newdata']['type']=='folder') $data['folderarr'][]=IO::getFolderByIcosdata($return['newdata']);
$data['successicos'][$return['icoid']]=$return['newdata']['icoid'];
}else{
$data['error'][]=$return['name'].':'.$return['success'];
}
}


那么我们继续到CopyTo方法中看一下

function CopyTo($opath,$path,$iscopy=0){
if($io=self::initIO($opath)) return $io->CopyTo($opath,$path,$iscopy);
else return false;
}


这里$io是io_dzz调用了io_dzz的CopyTo方法

default:
$re=IO::multiUpload($icoid,$path,$data['name']);
if($re['error']) $data['success']=$re['error'];
else{
$data['newdata']=$re;
$data['success']=true;
}
break;
}


关键的代码段在这里,直接UPload到web应用的目录中来

public function multiUpload($opath,$path,$filename,$attach=array(),$ondup="newcopy"){


看到上传文件这里

if($size<$partsize){
//获取文件内容
$fileContent='';

if(!$handle=fopen($filepath, 'rb')){
return array('error'=>'打开文件错误');
}
while (!feof($handle)) {
$fileContent .= fread($handle, 8192);
}
fclose($handle);

return self::upload($fileContent,$path,$filename);


直接调用了自己的上传方法。这个upload方法会将文件上传的最终目录写在返回包中
我自己在本地测试了一下

QQ20160411-3@2x.png


QQ20160411-4@2x.png


QQ20160411-5@2x.png


百度了一下,发现存在好多的dzzoffice用户呢

QQ20160411-6@2x.png


随便找了一个测试一下

QQ20160411-7@2x.png


QQ20160411-8@2x.png

漏洞证明:

任意文件包含漏洞
问题文件在dzz/system/save.php之中

}elseif($_GET['do']=='move'){


当是move方法的时候
从115行开始看

if($sourcetype=='icoid'){//是ico时
$data=array();
$totalsize=0;
$data['gid']=$gid;
$data['iscopy']=$iscopy;
$icos=$folderids=array();
//分4种情况:a:本地到api;b:api到api;c:api到本地;d:本地到本地;
foreach($icoids as $icoid){
//在目标位置创建
$opath=rawurldecode($icoid);
$path=rawurldecode(str_replace(array('_dock_','icosContainer_folder_','icosContainer_body_'),'',$container));
$return=IO::CopyTo($opath,$path,$iscopy);
//调用了IO类的CopyTo方法
if(!$iscopy && !$return['moved']){
$return = IO::DeleteByData($return);
}
if($return['success']===true){
$data['icoarr'][]=$return['newdata'];
if(!$tbz){
addtoconfig($return['newdata'],$ticoid);
}
if($return['newdata']['type']=='folder') $data['folderarr'][]=IO::getFolderByIcosdata($return['newdata']);
$data['successicos'][$return['icoid']]=$return['newdata']['icoid'];
}else{
$data['error'][]=$return['name'].':'.$return['success'];
}
}


那么我们继续到CopyTo方法中看一下

function CopyTo($opath,$path,$iscopy=0){
if($io=self::initIO($opath)) return $io->CopyTo($opath,$path,$iscopy);
else return false;
}


这里$io是io_dzz调用了io_dzz的CopyTo方法

default:
$re=IO::multiUpload($icoid,$path,$data['name']);
if($re['error']) $data['success']=$re['error'];
else{
$data['newdata']=$re;
$data['success']=true;
}
break;
}


关键的代码段在这里,直接UPload到web应用的目录中来

public function multiUpload($opath,$path,$filename,$attach=array(),$ondup="newcopy"){


看到上传文件这里

if($size<$partsize){
//获取文件内容
$fileContent='';

if(!$handle=fopen($filepath, 'rb')){
return array('error'=>'打开文件错误');
}
while (!feof($handle)) {
$fileContent .= fread($handle, 8192);
}
fclose($handle);

return self::upload($fileContent,$path,$filename);


直接调用了自己的上传方法。这个upload方法会将文件上传的最终目录写在返回包中
我自己在本地测试了一下

QQ20160411-3@2x.png


QQ20160411-4@2x.png


QQ20160411-5@2x.png


百度了一下,发现存在好多的dzzoffice用户呢

QQ20160411-6@2x.png


随便找了一个测试一下

QQ20160411-7@2x.png


QQ20160411-8@2x.png

修复方案:

对文件的上传做好限制就行了

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2016-04-12 17:42

厂商回复:

感谢你的反馈,通过上面一个任意包含文件的反馈,我们已经意识到这个问题,再修补上个问题时同时修复了这个问题。
非常感谢你,如有更多交流欢迎邮件到我的邮箱

最新状态:

暂无