近段时间发现很多 APP 使用 ThinkCMF,该源码存在 getshell 漏洞,Sine 安全对该高危漏洞进行分析和修复,攻击者可通过构造特定请求包向远程服务器执行任意脚本。
根据 index.php 的配置,项目路径为 application,打开 Portal 下的 Controller 目录,选择一个控制类文件。
图片链接:https://a5img.pncdn.cn/2019/1120/1574217612162.png
发现其父类为 CommonController、HomeBaseController。
在 HomeBaseController 中加入测试代码。
图片链接:https://tianxun.xyz/Images/easyvpn24/BEAJbgAIgH.jpg
ThinkPHP 是基于 MVC 的应用框架,核心部件为模型(M)、视图(V)、控制器(C)。
代码添加在控制器中,通过 a 参数指定要执行的函数名;该函数修饰符应为 public,符合条件。
可以通过如下 URL 访问,并可添加 GET 参数 arg1 传递给函数。
链接:cmfx-master/?a=test_public&arg1=run%20success
HomeBaseController 中有若干 public 函数,重点关注 display。其描述为可自定义加载模版,通过 parseTemplate 确定模版路径,若不符合原先的约定则从当前目录开始匹配。
随后调用 ThinkPHP 控制器的 display 方法。
该过程加载模板并输出页面,可能返回输出内容。
接着调用 Think View 的 fetch,TMPL_ENGINE_TYPE 为 Think,模板内容在 ParseTemplateBehavior 中解析。
如下调用即可加载任意文件。
链接:http://127.0.0.1:81/cmfx-master/?a=display&templateFile=README.md
五、执行漏洞
图片链接:https://a5img.pncdn.cn/2019/1120/1574217612239.png
网站漏洞修复建议:通过审计发现,重点在于对 display 和 fetch 的修饰符模板函数进行修改。对程序代码不熟悉时,建议联系专业的安全公司,如 Sinesafe、绿盟、启明星辰等。很多 App 调用该程序的 API 接口源码,遇到此问题应进行全面的网站漏洞检测和渗透测试,以防范此类攻击。
