知识点
1、SSTI定义(转载)
SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。
常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI也是注入类的漏洞,其成因其实是可以类比于sql注入的。
sql注入是从用户获得一个输入,然后又后端脚本语言进行数据库查询,所以可以利用输入来拼接我们想要的sql语句,当然现在的sql注入防范做得已经很好了,然而随之而来的是更多的漏洞。
SSTI也是获取了一个输入,然后再后端的渲染处理上进行了语句的拼接,然后执行。当然还是和sql注入有所不同的,SSTI利用的是现在的网站模板引擎(下面会提到),主要针对python、php、java的一些网站处理框架,比如Python的jinja2 mako tornado django,php的smarty twig,java的jade velocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。
2、模块引擎
让我们看一下百度的解释:
再看一下大佬的解释:
也就是说,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。
模板引擎也会提供沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术来进行绕过。
详细可参考大佬的笔记:模板引擎的整理归纳 - 知乎 (zhihu.com)
3、SSTI类型
这是从网上找到的SSTI小思维导图,那么如何判断是什么类型的SSTI漏洞了?
当然是通过输入特定值回显来判断
For example:
如图,通过输入{{7*'7'}}来判断是Jinja2还是Twig,如若返回值是49 那就是Twig,返回值是7777777 (7个7)那就是Jinja2类型
4、SSTI基本函数
基本函数网上都有我就不一一列举了若有需要可以参考:SSTI完全学习_大千SS的博客-CSDN博客
例题:BUUCTF [BJDCTF2020]Cookie is so stable 1
打开链接发现只有一个欢迎界面,我们查看源码发现有一个flag.php尝试打开
得到:
看见这个界面再结合题目提示(cookie及源码中的hint)我们先进行bp抓包
这里就涉及到了上面所普及的知识点----SSTI模板注入
我们先由上面的知识来判断它的类型
这里的user是本题的注入点,开始作者以为username是注入点,之后随便输入一个值提交之后在网页中F12查看cookie才发现user才是本题的注入点
得到注入点后开始解题,在cookie的一长串代码之后加;后加上user={{7*'7'}}
若回显49则表示是Twig模块
回显7777777即7个7则是Jinja2模块
发现回显49,表明为Twig模块
这里普及一个小知识Twig模块是固定的pyload注入:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}//查看id
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}//查看flag
先用上面查看id的代码尝试一下发现没有flag的信息
接着用语句再查询一下flag
即得到flag