thinkcmf 網站最新漏洞修復方法

網站安全發表於2019-11-20

近段時間發現很多APP程式用的是thinkcmf,此程式原始碼存在getshell漏洞,我們Sine安全緊急對此高危漏洞進行了分析和漏洞修復,攻擊者可以通過構造特定的請求包get請求即可在遠端伺服器上執行任意指令碼程式碼。

根據index.php中的配置,專案路徑為application,開啟 Portal 下的 Controller 目錄,選擇一個控制類檔案。

thinkcmf 網站最新漏洞修復方法

發現他的父類為Common\Controller\HomebaseController。

在HomeBaseController中加入如下測試程式碼

thinkcmf 網站最新漏洞修復方法

ThinkPHP是一套基於MVC的應用程式框架,被分成三個核心部件:模型(M)、檢視(V)、控制器(C)。

由於新增的程式碼在控制器中,根據ThinkPHP框架約定可以通過a引數來指定對應的函式名,但是該函式的修飾符必須為Public, 而新增的程式碼正好符合該條件。

可以通過如下URL進行訪問,並且可以新增GET引數arg1傳遞給函式。

cmfx-master/?a=test_public&arg1=run%20success

HomeBaseController類中有一些訪問許可權為public的函式,重點關注display函式.看描述就是可以自定義載入模版,通過$this->parseTemplate 函式根據約定確定模版路徑,如果不符合原先的約定將會從當前目錄開始匹配。

然後呼叫THinkphp Controller 函式的display方法

/**

* 載入模板和頁面輸出 可以返回輸出內容

@access public

@param string $templateFile 模板檔名

@param string $charset 模板輸出字符集

@param string $contentType 輸出型別

@param string $content 模板輸出內容

@return mixed

*/

public  function  display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') {

parent::display($this->parseTemplate($templateFile), $charset, $contentType,$content,$prefix);

}

再往下就是呼叫Think View的fetch方法,這裡的TMPL_ENGINE_TYPE 為Think, 最終模版內容解析在ParseTemplateBehavior中完成

如下呼叫即可載入任意檔案

http://127.0.0.1:81/cmfx-master/?a=display&templateFile=README.md

五、執行漏洞

thinkcmf 網站最新漏洞修復方法

網站漏洞修復建議

通過此次審計程式碼發現問題的重點是對display 和 fetch 函式的修飾符模板函式進行修改,如果對程式程式碼不熟悉的話建議聯絡專業的網站安全公司來修復漏洞,國內做的比較專業的如Sinesafe,綠盟,啟明星辰,等等,對此很多app呼叫此程式的api介面原始碼,建議大家遇到此問題首先要進行全面的網站漏洞檢測和滲透測試,來達到事先預防此類攻擊帶來的危害。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31542418/viewspace-2664902/,如需轉載,請註明出處,否則將追究法律責任。

相關文章