夜樱

Flask/Jinja2中的服务端模版注入(SSTI)
一直忙着写自己的qqbot就没写文章了,咕咕咕了这么久就来水一篇文吧。Flask 是一个使用 Python 编写的...
扫描右侧二维码阅读全文
19
2019/09

Flask/Jinja2中的服务端模版注入(SSTI)

一直忙着写自己的qqbot就没写文章了,咕咕咕了这么久就来水一篇文吧。

Flask 是一个使用 Python 编写的轻量级 Web 应用框架,里面的中间件可以快速让用户搭建一个属于自己的web服务器作为站点,其中采用jinja2模板引擎传递参数,在书写不规范的时候会发生jinja模板语法的注入命令执行

Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身

我们这里利用vulhub快速搭建好漏洞环境

分析:
直接上一个vulhub环境搭建的jinja2模板存在漏洞的代码
flask.png
分析这段代码:先将flask组件实例化后,利用flask的route装饰器 提供一个网页路径的一个路由功能,定义了一个index的方法,很明显可以看到name的函数名通过request.args.get的方法获得到url上的传参数参数,在通过传递参数用template方法作为一个模板 , 最后通过render的方法渲染模板。

t = Template("Hello " + name)中,Template()完全可控,那么就可以直接写入jinja2的模板语言。在这行代码中并没有规范的编写传参导致template直接交给用户直接传参执行用户的代码。

漏洞执行试验:
因为name是作为一个变量直接传入,所以用户利用jinja2的模板传参方法就可以提交给服务器执行这段代码
在jinja2中模板传参方法是通过{{ }}

所以这里直接构建一个xss的playload:
?name={{'<script>window.location.href="http://osu.ppysh"</script>'}}
我们直接提交构造的代码放上去

not_safe.png

当我们提交这段代码后,可以清楚的看见左下角已经有了我们指定跳转网页的响应信息,之后就会跳跃到我们指定的域名上,造成XSS跳转攻击

test.png

防范方法:

safe_code.png

将代码修改成以jinja2正确传参方式以变量名的方式,丢弃掉以+为拼接的方法 交给模板渲染后再次尝试

test2.png

会发现我们因为之前已经套过一层jinja2的传参方法,这个再用jinja2的传参没法就没办法被模板渲染正确从而防止了SSTI

如果一个网站存在XSS漏洞那么也极有可能存在SSTI漏洞

osu.png

Web中安全真理:永远不要相信用户的输入是合法的

Last modification:September 19th, 2019 at 07:00 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment