近段時(shí)間發(fā)現(xiàn)很多APP程序用的是thinkcmf,此程序源碼存在getshell漏洞,我們Sine安全緊急對(duì)此高危漏洞進(jìn)行了分析和漏洞修復(fù),攻擊者可以通過(guò)構(gòu)造特定的請(qǐng)求包get請(qǐng)求即可在遠(yuǎn)程服務(wù)器上執(zhí)行任意腳本代碼。
根據(jù)index.php中的配置,項(xiàng)目路徑為application,打開(kāi) Portal 下的 Controller 目錄,選擇一個(gè)控制類(lèi)文件。
發(fā)現(xiàn)他的父類(lèi)為Common\Controller\HomebaseController。
在HomeBaseController中加入如下測(cè)試代碼
ThinkPHP是一套基于MVC的應(yīng)用程序框架,被分成三個(gè)核心部件:模型(M)、視圖(V)、控制器(C)。
由于添加的代碼在控制器中,根據(jù)ThinkPHP框架約定可以通過(guò)a參數(shù)來(lái)指定對(duì)應(yīng)的函數(shù)名,但是該函數(shù)的修飾符必須為Public, 而添加的代碼正好符合該條件。
可以通過(guò)如下URL進(jìn)行訪問(wèn),并且可以添加GET參數(shù)arg1傳遞給函數(shù)。
cmfx-master/?a=test_public&arg1=run%20success
HomeBaseController類(lèi)中有一些訪問(wèn)權(quán)限為public的函數(shù),重點(diǎn)關(guān)注display函數(shù).看描述就是可以自定義加載模版,通過(guò)$this->parseTemplate 函數(shù)根據(jù)約定確定模版路徑,如果不符合原先的約定將會(huì)從當(dāng)前目錄開(kāi)始匹配。
然后調(diào)用THinkphp Controller 函數(shù)的display方法
/**
* 加載模板和頁(yè)面輸出 可以返回輸出內(nèi)容
* @access public
* @param string $templateFile 模板文件名
* @param string $charset 模板輸出字符集
* @param string $contentType 輸出類(lèi)型
* @param string $content 模板輸出內(nèi)容
* @return mixed
*/
public function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') {
parent::display($this->parseTemplate($templateFile), $charset, $contentType,$content,$prefix);
}
再往下就是調(diào)用Think View的fetch方法,這里的TMPL_ENGINE_TYPE 為T(mén)hink, 最終模版內(nèi)容解析在ParseTemplateBehavior中完成
如下調(diào)用即可加載任意文件
五、執(zhí)行漏洞
網(wǎng)站漏洞修復(fù)建議
通過(guò)此次審計(jì)代碼發(fā)現(xiàn)問(wèn)題的重點(diǎn)是對(duì)display 和 fetch 函數(shù)的修飾符模板函數(shù)進(jìn)行修改,如果對(duì)程序代碼不熟悉的話建議聯(lián)系專(zhuān)業(yè)的網(wǎng)站安全公司來(lái)修復(fù)漏洞,國(guó)內(nèi)做的比較專(zhuān)業(yè)的如Sinesafe,綠盟,啟明星辰,等等,對(duì)此很多app調(diào)用此程序的api接口源碼,建議大家遇到此問(wèn)題首先要進(jìn)行全面的網(wǎng)站漏洞檢測(cè)和滲透測(cè)試,來(lái)達(dá)到事先預(yù)防此類(lèi)攻擊帶來(lái)的危害。
我們專(zhuān)注高端建站,小程序開(kāi)發(fā)、軟件系統(tǒng)定制開(kāi)發(fā)、BUG修復(fù)、物聯(lián)網(wǎng)開(kāi)發(fā)、各類(lèi)API接口對(duì)接開(kāi)發(fā)等。十余年開(kāi)發(fā)經(jīng)驗(yàn),每一個(gè)項(xiàng)目承諾做到滿意為止,多一次對(duì)比,一定讓您多一份收獲!