Metinfo 6.1.3 XSS漏洞分析

文章首发于安全客,Metinfo 6.1.3 XSS漏洞分析

前言

前段时间看到一个cms造成的xss漏洞,这里想分析下。这个漏洞是metinfo6.1.3版本因参数问题造成前台和后台引起了两处xss漏洞。

这个漏洞的影响范围一直到最新版本(6.1.3),因为前段时间爆出的漏洞,所以新版本应该已修复。
cms最新6.13下载地址:https://www.mituo.cn/download/

前台漏洞分析( CVE-2018-20486)

通过在前台插入xss访问,然后会在后台触发xss,造成xss攻击。
漏洞的触发点在
admin/login/login_check.php

Metinfo 6.1.3 XSS漏洞分析_第1张图片
image.png

这里加载了 $commonpath=$depth.'include/common.inc.php',然后在如下的代码段里存在变量覆盖漏洞: (admin/include/common.inc.php 77行)

Metinfo 6.1.3 XSS漏洞分析_第2张图片
image.png

然后往下分析,回头看admin/login/login_check.php这段代码

Metinfo 6.1.3 XSS漏洞分析_第3张图片
image.png

$url_array变量是我们可控的,从而控制$truefile变量,进入下个if语句,if语句中存在更改数据库信息的mysql语句,从而可以直接更改数据库信息
$_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_code'] = $_M['config']['met_adminfile'];
        $_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']中,也就是通过这个就可以找到我们可以构造的点了。

Metinfo 6.1.3 XSS漏洞分析_第4张图片
image.png

看到这里就会发现离我们可构造的XSS不远了,这段存在于app/system/safe/admin/templates/index.php (72行),可以发现,这里标签直接输出了met_adminfile的值,因此造成了一个存储型的XSS漏洞。
XSS payload:

http://127.0.0.1/metinfo6.13/admin/login/login_check.php?url_array[]=123&url_array[]=123&url_array[]=aa" onfocus=alert(/xss/) &url_array[]=123

这里用onfocus属性造成的弹框。
onfocus:

当 input 输入框获取焦点时执行一段 Javascript代码:

XSS的构造方式有很多中,但是只要满足输出条件即可:
$turefile=$url_array[count($url_array)-2]在倒数第二个值中输入我们想要的值就可以了,不断传入url_array[]数组的值然后$truefile返回的是数组倒数第二个值,然后$truefile会被带入数据库中被更新,然后后台在点击带有那个标签页面时便会触发XSS

1.1 前台漏洞复现

其实这个漏洞也不完全是前台,因为它只是通过通过URL访问后台目录,虽然无回显但是可以成功插入信息。
XSS Payload:

http:// 127.0.0.1/metinfo6.13/admin/login/login_check.php?url_array[]=123&url_array[]=123&url_array[]=aa" onfocus=alert(/xss/) &url_array[]=123

然后直接访问,无回显。
这时登录后台,点击安全与效率页面

Metinfo 6.1.3 XSS漏洞分析_第5张图片
metinfo.png
Metinfo 6.1.3 XSS漏洞分析_第6张图片
image.png

点击后台文件夹的文件名即可触发xss。其实可以发现后台文件名已经被更改了,并插入了XSS代码。每当更改文件便会触发XSS,这里就是通过更改$truefile的值传进数据库,从而更新了文件名。
我们可以通过这个存储型XSS漏洞去拿管理员cookie。

获取cookie-payload:

http:// 127.0.0.1/metinfo6.13/admin/login/login_check.php?url_array[]=1&url_array[]=1&url_array[]=aa" &metcms=1

Metinfo 6.1.3 XSS漏洞分析_第11张图片
image.png

这里我们可以看出它会将信息最终通过metcms参数输出在页面中,因此也就造成了xss。

Metinfo 6.1.3 XSS漏洞分析_第12张图片
image.png

3.0 总结

修复建议: 因为最新版本应该已经修复相关漏洞,可以升级为新版本,或暂缓修复后台(admin/include/common.inc.php)存在的变量覆盖漏洞。
metinfo出现的xss漏洞较多,但xss在能够利用的情况下产生的危害也较大,因此在开发时应考虑到造成漏洞的不同场景,尽可能的避免漏洞存在。针对XSS最常见的可以对输入(和URL参数)进行过滤,对输出进行编码,也可以对关键字进行黑名单或白名单的过滤等等。

你可能感兴趣的:(Metinfo 6.1.3 XSS漏洞分析)