thinkcmfx漏洞分析

前言

看了师傅们的分析,对tp不熟悉所以还是有疑问,自己分析一下,勿喷 : )

payload

?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

代码分析

application\Common\Conf\config.php

看一下配置文件,默认的模块就是Portal,分别用g/m/a获取模块/控制器/方法.

直接看controller目录下的IndexController.class.php文件。该文件继承父类HomebaseController,跟进看一下这个文件,定位到fetch函数

单步跟踪会发现往下调用的还是thinkphp的fetch方法

simplewind\Core\Library\Think\View.class.php

传入的三个参数对应该函数的三个变量,其中模板templatefile要存在,不然会直接返回,接下来会获取程序的模板解析引擎,thinphp默认的解析引擎是Think而不是php,

simplewind\Core\Conf\convention.php

模板引擎不是php时就会解析视图标签,通过Hook类的listen方法调用view_parse对应的行为,在simplewind\Core\Mode\common.php中规定了该行为对应的处理类

跟进看一下这个类

simplewind/Core/Library/Behavior/ParseTemplateBehavior.class.php

直接看入口run方法

采用Think模板引擎时会首先检查是否已经有缓存文件,没有的话就通过fetch方法重新解析标签,有的话通过load方法加载文件

看一下load方法

simplewind/Core/Library/Think/Storage/Driver/File.class.php

直接包含缓存文件,导致代码被执行,把文件写入到web目录下。

生成的缓存文件位置在runtime/Cache目录下。

3 个赞