前言
看了师傅们的分析,对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目录下。