审了一个基本tp3.2.3的一个系统,网上搜索发现了tp3.2.3中如果模板赋值方法assign的第一个参数可控,可以导致文件包含漏洞,之前只是看了tp3.2.3的注入
0x01:TP模板引擎
官方文章中模板的描述
简单来说我们可以在控制中定义
然后在view下建立一个html文件
在html中可以显示控制器中的给的赋值
访问控制器
可以看到输出了刚刚的变量,对于assign函数即第一个参数为变量名,第二个为变量值
0x02:漏洞复现
首先新建一个函数如下
其中assign中$value值可控
将phpinfo写入日志中
这里打开日志发现通过浏览器访问会被url编码
抓包访问即可
访问:
/index.php?m=home&c=user&a=index&&value[_filename]=./Application/Runtime/Logs/Common/22_03_28.log
即访问存在漏洞的控制器,value为控制变量的值
0x03:漏洞分析
在assign处设置断点
刷新访问的链接,进入调试模式,前面是tp去模块,控制器等的一些操作,可以直接到模块赋值部分
$name为我们传入的value值,即为日志
进入到assign函数,进行赋值
然后到display进行模板输出
通过fetch对模块进行解析,
此时传入的参数内容都为空
[](http://www.str1am.top/wordpress/wp-content/uploads/2022/03/wp_editor_md_f63b651c8c60b8e40f0cf1f4449441c1.j返回
会判断模板文件是否存在,所以利用此漏洞至少保证模板文件存在,然后是寻找模板文件的流程
经过一定的处理后进入了exec函数
其中$params中包含了我们输入的日志文件
进入exec函数
进入了run入口的方法,接下来就是冗长的解析模板文件的流程,也可以跳过不看
最后解析完成加载模板文件
进入loadTemplate读取模板内容
然后又是一段解析模板的流程
最终进入到了fetch函数的load函数中
进入load函数
其中$vars使我们传入的日志值
使用了extract进行处理,type的值为EXTR_OVERWRITE
这个借用w3school解释一下
标识变量有同名元素会进行覆盖,那么最终我们传入的filename就是日志文件
从而导致产生了文件包含漏洞