近段時間發現不少APP程序用的是thinkcmf,此程序源碼存在getshell漏洞,咱們Sine安全緊急對此高危漏洞進行了分析和漏洞修復,攻擊者能夠經過構造特定的請求包get請求便可在遠程服務器上執行任意腳本代碼。php
根據index.php中的配置,項目路徑爲application,打開 Portal 下的 Controller 目錄,選擇一個控制類文件。shell
發現他的父類爲Common\Controller\HomebaseController。api
在HomeBaseController中加入以下測試代碼安全
ThinkPHP是一套基於MVC的應用程序框架,被分紅三個核心部件:模型(M)、視圖(V)、控制器(C)。服務器
因爲添加的代碼在控制器中,根據ThinkPHP框架約定能夠經過a參數來指定對應的函數名,可是該函數的修飾符必須爲Public, 而添加的代碼正好符合該條件。app
能夠經過以下URL進行訪問,而且能夠添加GET參數arg1傳遞給函數。框架
cmfx-master/?a=test_public&arg1=run%20success函數
HomeBaseController類中有一些訪問權限爲public的函數,重點關注display函數.看描述就是能夠自定義加載模版,經過$this->parseTemplate 函數根據約定肯定模版路徑,若是不符合原先的約定將會從當前目錄開始匹配。測試
而後調用THinkphp Controller 函數的display方法fetch
/**
* 加載模板和頁面輸出 能夠返回輸出內容
* @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
5、執行漏洞
網站漏洞修復建議
經過這次審計代碼發現問題的重點是對display 和 fetch 函數的修飾符模板函數進行修改,若是對程序代碼不熟悉的話建議聯繫專業的網站安全公司來修復漏洞,國內作的比較專業的如Sinesafe,綠盟,啓明星辰,等等,對此不少app調用此程序的api接口源碼,建議你們遇到此問題首先要進行全面的網站漏洞檢測和滲透測試,來達到事先預防此類攻擊帶來的危害。