近段时间发现不少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接口源码,建议你们遇到此问题首先要进行全面的网站漏洞检测和渗透测试,来达到事先预防此类攻击带来的危害。