PYTHON
Flask
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
app.config['See'] = "passwd:12345"
@app.route("/")
def index():
name = request.args.get('name', 'guest')
t = Template('''
<html>
<head>
<title>SSTI_TEST</title>
</head>
<body>
<h1>hello, %s</h1>
</body>
</html>
''' % (name))
return t.render()
if __name__ == "__main__":
app.run()
|
简单运行结果:
当name={{5*6}}
的时候,就会显示hello,30
。
说明name的参数被执行。
SSTI的关键词就是,参数被执行。
关于为什么会被执行,简单的说法就是,输入的内容,先加入渲染,然后一起输出。
一个不会出现SSTI的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
app.config['See'] = "passwd:12345"
@app.route("/")
def index():
return render_template("index.html", title="SSTI_TEST", name=request.args.get("name"))
if __name__ == "__main__":
app.run()
|
1
2
3
4
5
6
7
8
9
|
//index.html
<html>
<head>
<title>{{title}} - cl4y</title>
</head>
<body>
<h1>Hello, {{name}} !</h1>
</body>
</html>
|
- 服务器先将前端的index.html渲染,然后从后端获取用户输入——就像往空缺的地方搭积木一样放进去,就只是放进去,不会参与解析渲染。
Jinja2
一个python的模板引擎,被广泛利用
在上面的代码示例中就使用了Jinja2,不过造成SSTI的不是Jinja2本身代码哪里有错误,而是,用户的使用不当。
也就是:
Jinja2作为一个模板引擎,其设计允许在模板中执行复杂的表达式和调用Python函数,这为其提供了强大的功能性,但也带来了安全风险。如果未能正确处理用户输入,这些强大的功能就可能被攻击者利用,从而导致SSTI漏洞。
Jinja2语法简介:
假设layout.html
Jinja2渲染时候,会将标记着 {
和百分号 的部分进行插值
假如传入的user列表如下:
1
2
3
4
5
|
users = [
{"username": "alice", "url": "/users/alice"},
{"username": "bob", "url": "/users/bob"},
{"username": "carol", "url": "/users/carol"}
]
|
最终就会呈现下面的效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<main>
<ul>
<li><a href="/users/alice">alice</a></li>
<li><a href="/users/bob">bob</a></li>
<li><a href="/users/carol">carol</a></li>
</ul>
</main>
|