0%

SSTI学习

SSTI

模板引擎

SSTI 就是服务器端模板注入(Server-Side Template Injection)

Web开发中,模板引擎是为了使得用户界面和业务逻辑处理分离所产生。而SSTI的成因则是因为服务端没有对用户的输入做很好的处理而产生。

我们最常见到的模板语言便是jinja2,它是Flask框架一部分。它能够用于替换变量,将动态数据渲染到静态 HTML 页面。格式如下:

1
2
3
4
5
6
7
变量:
{{username}}
控制语句:
{% for comment in comments %}
<li>{{comment}}</li>
{% endfor %}

通常在flask渲染html之前会有一个本地的html界面来作为模板,位于app.py同目录下的templates之下,

这里给出示例:

1
2
3
4
5
6
7
8
<html>
<head>
<title>SSTI</title>
</head>
<body>
<h3>Hello, {{name}}</h3>
</body>
</html>

其中hello是静态的,而被{{}}包裹的name则可以被动态的替换,而执行这一替换逻辑就是app.py的任务。

我们给出以下示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask, request, render_template

app = Flask(__name__) #__name__是一种属性一样的东西,通常指向该文件的文件名__main__,如果是外部调用得到则有可能是app

@app.route('/',methods=['GET'])
#设置路由,get方式获取传递的参数
def hello_world():
query = request.args.get('name') # GET取参数name的值
return render_template('test.html', name=query) #将name的值传入模板,进行渲染

if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
#让操作系统监听所有公网 IP,此时便可以在公网上看到自己的web,同时开启debug,方便调试。开启debug后直接刷新页面就可以看到更改的界面

除了用query = request.args.get(‘name’)来获取参数传递,也可以通过 URL 路径参数 (/<name>) 获取。,该方法支持参数类型的限制,例如 <int:id>

模板注入

凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是

通常有很多各个语言的常见框架,不同模板则有着不同的语法,总结如下:

附表

img

img

魔术方法

1. SSTI(模板注入)漏洞(入门篇) - bmjoker - 博客园

Flask SSTI靶场记录 - lca

初探 Python Flask+Jinja2 SSTI - Zh1z3ven - 博客园