\apps\public\Lib\Action\CommentAction.class.php reply函数
不管中间过程,$var被赋值被$_GET,并在最后进入了assign函数
\core\OpenSociax\Action.class.php assign
assign其实就是给模板变量赋值,也就是说我们的$_GET最后进入了模板变量中。
然后回到一开始的reply函数,可以看到在最后调用了display:
\core\OpenSociax\functions.inc.php display函数
fetch找到相应的模板并和我们提交的变量结合编译之:
\core\OpenSociax\Action.class.php fetch函数
把请求转发给真正的fetch函数:
\core\OpenSociax\functions.inc.php
分析下这个函数的逻辑:
首先判断模板文件是否存在,不存在则尝试加载默认模板文件,如果加载失败就异常退出
其次如果模板文件存在,那么该文件是否缓存过,如果缓存过,那么直接include缓存文件,在include前使用extract对模板变量赋值
如果模板没有缓存,是第一次被调用,那么就编译模板文件并加载它
在使用缓存的时候程序用extract对变量进行赋值,可以看到第二个参数,EXTR_OVERWIRTE,表示如果某变量已经存在,那么就覆盖这个变量。
下面看看非缓存情况下的处理:
\core\OpenSociax\Template.class.php load函数
与缓存情况下相同,也是调用extract来覆盖变量,由于第二个参数的使用,因此如果模板变量可控的话,我们可以覆盖任意变量。
可以覆盖$templateCacheFile变量,这样变量覆盖就变成了任意文件包含,并可getshell.