Flask是一个使用Python编写的轻量级Web应用框架,使用BSD授权。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2。
Flask属于微框架(micro-framework),这既是优点也是缺点,优点是框架轻量,更新依赖少,更容易专注于安全方面的漏洞,缺点是不得不通过添加插件来增加依赖列表。Flask依赖中就有造成模板注入漏洞的插件Jinja2的模板引擎,Jinja2是一个面向Python的模板语言。
可通过wget或GitHub直接下载,可根据具体需求选择合适的下载方式。我们通过Docker(见公众号链接3-1)可以很方便地将漏洞复现环境搭建出来:
Docker-compose build // 编译下载漏洞环境所需的配置 Docker-compose up -d // 启动漏洞环境
安装完成后,访问“本机地址:8000端口”,出现如图3-1所示的界面,代表漏洞环境已经启动成功。
图3-1 访问漏洞页面
首先让我们来看一下漏洞Web服务的代码,源代码位于app目录下的app.py文件中,如下所示:
从这里可以看出name的值是直接从get参数中获取的,所以Template是完全可控的。要测试漏洞是否存在,要看能否执行Jinja2模板语言。这里测试一下能否将模板语言传递到参数中,如图3-2所示。
图3-2 验证漏洞
这里表示Jinja2是可以执行的。使用Pocsuite编写漏洞验证POC时,需要按照官方模板进行编写,对接API接口能很方便地完成POC脚本。POC的命名形式为:“组成漏洞应用名_版本号_漏洞类型名称”,然后把文件名中所有字母改成小写,所有的符号改成下划线“_”。文件名中不能有特殊字符和大写字母,最后形成的文件名应该像这样:_1847_seeyon_3_1_login_info_disclosure.py。