最近在刷题的过程中发现服务端模板注入的题目也比较常见,这类注入题目都比较类似,区别就在于不同的框架、不同的过滤规则可能需要的最终payload不一样,本文将以Flask为例学习模板注入的相关知识,也是对自己学习的一个记录。
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。优点就在于开发简单,代码量少,很多工作都在框架中被实现了。他与Django不同于Django是一个全能型框架,通常用于编写大型的网站。
而jinjia2、template、Mako等等都属于为框架提供功能支持的引擎,各有优缺点,也不是我们主要学习的内容。但我们要知道Flask默认使用的引擎为jinjia2,本文也会主要分析jinjia2中的注入问题。
首先配置flask与jinjia2引擎环境:
pip3 install flask pip3 install jinjia2
这时使用python -c "import flask"
回显无报错信息,证明需要的环境已经安装完毕,下面从一个最简单的flask例子开始学起。
#flaskapp.py from flask import * from jinja2 import * app = Flask(__name__) # 创建FLask类 @app.route("/") #设置的默认路由 def index(): #默认的视图函数,与路由绑定,用来处理用户访问网站跟目录/时的情况 name = request.args.get(‘name‘, ‘guest‘)#接受参数名为name 的参数传入 html = ‘‘‘ <h3>your input %s</h3> ‘‘‘%name #设置一个模板html,将name的值以%s输出 return render_template_string(html) #将html以字符串模板的形式渲染 #对应的,当html是一个文件时,使用render_template 函数来渲染一个指定的文件 if __name__==‘__main__‘: #作为主文件启动时 app.run(debug = True) #以debug模式运行
通过对上面简单例子的注释解释,可以看出,一个完整简单的Flask框架,由一个或很多个路由(route)、绑定的视图函数组成,而视图函数则用来对用户访问的这个路由进行处理,包括接收参数、创建模板、渲染,等等操作,对我们来说,容易出现问题的就在于render渲染的过程中没有对用户的输入进行限制与过滤,导致恶意的代码被注入,执行了用户输入的代码。
当需要不断的修改代码时,建议开启debug模式,否则每次修改都需要重新启动py文件,比较麻烦,启动debug模式使用下面的语句。
原文:https://www.cnblogs.com/zhiganglang/p/15212477.html