ThinkPHP3.2.3 RCE复现

审了一个基本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就是日志文件

从而导致产生了文件包含漏洞

发表评论

电子邮件地址不会被公开。 必填项已用*标注