tkcharlotte's blog

前言

看了师傅们的分析,对tp不是很熟,所以对一些地方还是有疑问,自己分析一下。:)

thinkcmfx是基于thinkphp3开发的框架,目前已停止更新,目前还在维护的是thinkcmf,基于tp5开发。本文分析的版本为github上的2.2.2版本

payload

1
?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目录下

 评论


载入天数...载入时分秒... | 字数统计:16.9k