SSTI(服务器端模板注入)
在python的SSTI类型里主要框架为:jinja2,mako,tornado,django,flask内默认使用的模板渲染引擎为jinja2所以其语法也一致
SSTI漏洞成因
当用户输入的数据没有被合理的处理控制和过滤时,有可能插入程序从而改变程序的执行逻辑,因而导致敏感信息泄露,代码执行,getshell
Flask基本语法
- {{ ... }}:装载一个变量,渲染模板的时候,会使用传进来的同名参数将这个变量代表的值替换掉
- {% ... %}:装载一个控制语句 if..
- {# ... #}:装载一个注释,模板渲染的时候会忽略这中间的值
过滤器:在html中传入的变量进行处理,其格式{{变量|过滤器}},以变量作为参数的函数返回处理后的结果upper()/lower()/length()函数等..
搭建Flask环境--以pycharm为例
pip install virtualenv 安装虚拟环境
python -m virtualenv env 开启虚拟环境
pip install flask 安装flask
即在本机访问http://127.0.0.1:5000/ 便可得到hello 2333!
route路由
app.route("..")route装饰器的作用是将函数与url绑定起来,使用route()告诉Flask什么样的URL能够触发函数
带参数的路由
当你在地址栏中输入http://127.0.0.1:5000/hello/Sviivya0- 将看到Hello Sviivya0-这个字样,URL里的参数被作为参数传进来当然还有int,float,path
| 转换类型 | 作用 |
| ------------ | -------------- |
| int | 整型 |
| float | 浮点型 |
| path | 可以有斜杠,字符型 |
多路由规则:则访问/和/hello都不带参数为空
路由规则还可以设置请求方法get,post等..
路由也可绑定ip和端口,使用debug便于调试不用每次重跑程序,ctrl+C即可更新web网站内容
Flask渲染方法
Flask的渲染方法分为两种:render_template(),render_template_string()
- render_template()函数渲染指定文件,函数会自动在templates文件夹中找到对应的html(模板文件),所以不用写完整的html文件路径,即可直接跳转页面
```python
from flask import Flask,render_template
app = Flask(name)
@app.route('/')
def index():
context = {
'username':'ssss',
'gender':'yyyy'
}
return render_template('index.html',**context)
if name == 'main':
app.run(debug=True,use_reloader=False)
2. render_template_string()函数用来渲染一个字符串这里列出一个的SSTI例子
```python
from flask import Flask
from flask import render_template
from flask import request
from flask import render_template_string
app = Flask(__name__)
@app.route('/test/')
def test():
code = request.args.get('id')
html = '''
<h3>%s</h3>
'''%(code)
return render_template_string(html)
if __name__ == '__main__':
app.debug = True
app.run()
漏洞的成因在于:render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,且code是可控的,因为flask是基于jinja2的 所以可以利用此语法,传入参数{{8*8}}会发现返回值为64 可以看到表达式被执行了
还可以进行xss弹窗写入
这里普及一下flask框架请求上下文requests中的args获取请求参数的方式(args只获取地址栏的参数部分get请求还是post请求!
在别的师傅博客中看到了这样一段代码
所以在这里普及一下python中的sys.argv[]的用法:总的来讲sys.argv[]就是从外部(用户所输入的参数)获取参数的桥梁,一个列表sys.argv[0]为程序本身
sys.argv[]其实就是一个列表,里面的项为为用户输入的参数,这就是从程序外部输入的
小结
这是我在学习ssti路上对基础的一些总结希望能够帮到初学者们拉~后续会继续更新漏洞利用方式等等~