ssti模板注入
什么是ssti模板注入
SSTI就是服务器端模板注入(Server-Side Template Injection)。
render_template渲染函数的问题,是引发该问题的原因。渲染函数在渲染的时候,往往对用户输入的变量不做渲染。
例如,在flask框架中,Jinjia2模板引擎将
1 |
|
包裹的当成变量解析替换。
常用模板引擎
网站模板引擎有jinja2、tornado、smarty、twig等等,那么如何判断遇到的是哪种类型,常用图如下。
常用类
__class__用来查看变量所属的类
__bases__用来查看类的基类。
subclasses()查看当前类的子类。
init 初始化类,返回的类型是function
globals 获取function所处空间下可使用的module、方法以及所有变量。
操作例子:
1 |
|
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
Jinjia模板,可以ssti注入。
使用
1 |
|
查出所有的类。
使用第72个site._Printer类(可以进行命令执行)
使用:
1 |
|
然后,使用[40]的file类,得到flag。
1 |
|
拿到flag.
2.xctf shrine
进入查看源码。
源码审计,测试/shrine/下有回显,但发现过滤 config变量和 self。并且会去除单边括号,所以上题方法失效了。
使用url_for函数。
url_for.__globals__获取全部全局变量。
然后找到app
构造
1 |
|
输入发现flag。