ThinkPHP的fetch方法探究

背景

前一段时间的,74cms的模板文件的问题,再一次看到了,当模板文件可控时存在去打问题

可导致服务器沦陷

今天在看代码的时候,发现了如下书写方式,当然是不存在问题,只是鉴于自己没有跟踪过相关方法,导致每次出现fetch方法的时候都会犹豫到底存不存在问题

$this->fetch('index',compact('list'))

故有此文

流程跟踪

这里的数据是从数据库中取出来的,而数据库的数据是可控的

代码段

1
2
3
4
5
6
public function index()
{
$model = new UserModel;
$list = $model->getList();
return $this->fetch('index', compact('list'));
}

首先是进入到,view的fetch方法中

vars参数中存在可控参数

1610433648146

然后会进入view的driver的fetch方法

此时的变量还是我们之前传入的变量没有什么变化

1610433748835

最后会进入templatefetch方法中进行渲染

vars是我们传入的变量

下面的cacheFile是模板文件的缓存

可以看到,模板文件缓存的生成,并没有我们传入vars变量的参与

1610434043106

也就是说,第二个变量可控的时候并不能,影响模板文件的生成,而只是一种值的输出

有点类似assigndispaly的第二个参数

故不存在影响,也就是可能存在xss

end

简单记录