flask渲染方法有render_template和render_template_string两种,我们需要做的就是,将我们想渲染的值传入模板的变量里
render_template() 是用来渲染一个指定的文件的。
render_template_string则是用来渲染一个字符串
flask的目录结构
├── app.py
├── static
│ └── style.css
└── templates
└── index.html
其中,static和templates都是需要自己新建的。其中templates目录里的index.html就是所谓的模板
我们写一个index.html
<html>
<head>
<title>{{title}}</title>
</head>
<body>
<h1>Hello, {{name}}!</h1>
</body>
</html>
这里面需要我们传入两个值,一个是title另一个是name。
我们在server.py里面进行渲染传
from flask import Flask, request,render_template,render_template_string
app = Flask(__name__)
def index():
return render_template("index.html",title='Home',name='user')
if __name__ == '__main__':
app.run()
在这里,我们手动传值的,所以是安全的,但是如果,我们传值的机会给用户,假如我们渲染的是一句话
from flask import Flask, request,render_template,render_template_string
app = Flask(__name__)
def test():
id = request.args.get('id')
html = '''
<h1>%s</h1>
'''%(id)
return render_template_string(html)
if __name__ == '__main__':
app.run()
如果我们传入一个xss就会达到我们需要的效果
这就是传入的值被html直接运行回显,我们对代码进行微改。
def test():
code = request.args.get('id')
return render_template_string('<h1>{{ code }}</h1>',code=code)
再次传入xss就不能实现了
因为在传入相应的值得时候,会对值进行转义,这样就很能好多而避免了xss这些
所以SSTI注入形成的原因就是:开发人员因为懒惰,没有将渲染模板写成一个文件,而是直接用render_template_string来渲染,当然,如果有传值过程还行,但是如果没有传值过程,传入数据不经过转义,那可能就会导致SSTI注入。那么漏洞原理就是因为不够严谨的构造代码导致的
未完待续~