public function fetch($template, $data = [], $config = [])
{
if ('' == pathinfo($template, PATHINFO_EXTENSION)) {
$template = $this->parseTemplate($template);
}
if (!is_file($template)) {
throw new TemplateNotFoundException('template not exists:' . $template, $template);
}
App::$debug && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export(array_keys($data), t
rue) . ' ]', 'info');
$this->template->fetch($template, $data, $config);
}
继续调用栈可以看下其实这个 fetch() 函数调用的是内置模板引擎的 fetch 方法, 这个方法实际
上就是将要输出的页面内容赋值给一个变量,为了方便,thinkphp 在对模板渲染的过程中,添
加了 php 标签功能,使得其可以解析 php 代码。
总之一句话,这个漏洞其实就是由于对传入变量过滤不严导致的模板引擎注入漏洞,只要控制了
传入模板的文件,就可以利用模板本身的渲染功能,实现包含漏洞 getshell
另外需要注意的是,当验证传入的模板是否是文件时,使用的 is_file() 函数,这个函数在 Linux
下和 windows 下的判断会有所不同,具体如下:
1、在 linux 下利用 is_file() 来判断类似于 /****/../../../../etc/passwd 文件时,如果 **** 是不存
在的目录,则会返回 false,在 windows 下 ,这个目录存在与否,均返回 true,如下图所示:
评论0
最新资源