文章首发于安全客,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
这里加载了 $commonpath=$depth.'include/common.inc.php'
,然后在如下的代码段里存在变量覆盖漏洞: (admin/include/common.inc.php
77行)
然后往下分析,回头看admin/login/login_check.php
这段代码
$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']
中,也就是通过这个就可以找到我们可以构造的点了。
看到这里就会发现离我们可构造的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
然后直接访问,无回显。
这时登录后台,点击安全与效率页面
点击后台文件夹的文件名即可触发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
这里我们可以看出它会将信息最终通过
metcms
参数输出在页面中,因此也就造成了xss。3.0 总结
修复建议: 因为最新版本应该已经修复相关漏洞,可以升级为新版本,或暂缓修复后台(
admin/include/common.inc.php
)存在的变量覆盖漏洞。
metinfo出现的xss漏洞较多,但xss在能够利用的情况下产生的危害也较大,因此在开发时应考虑到造成漏洞的不同场景,尽可能的避免漏洞存在。针对XSS最常见的可以对输入(和URL参数)进行过滤,对输出进行编码,也可以对关键字进行黑名单或白名单的过滤等等。