type
status
date
slug
tags
summary
category
icon
password
泄露pin码,访问console可以直接用python代码了

flask ssti
flask框架中如果存在类似如下代码:(带有{}或者%s之类的,如果是{{}}那么已经被转移则不会被攻击)
那么恶意代码可以注入产生执行
魔术方法
__class__:用于返回对象所属的类__base__:以字符串的形式返回一个类所继承的类__bases__:以元组的形式返回一个类所继承的类__mro__:返回解析方法调用的顺序,按照子类到父类到父父类的顺序返回所有类__subclasses__():获取类的所有子类__init__:所有自带带类都包含init方法,常用他当跳板来调用globals__globals__:会以字典类型返回当前位置的全部模块,方法和全局变量,用于配合init使用POC构造
先浅浅看一下具体怎么样能打:
如果是%s那么


和{}.format,似乎是一样的,都是{{}}


那么现在拿到
第一步:
==目的:使用
__class__来获取内置类所对应的类==可以通过使用
str,list,tuple,dict等来获取>>>''.__class__
#<class 'str'>>>>().__class__
#<class 'tuple'>>>>[].__class__
#<class 'list'>>>>{}.__class__
#<class 'dict'>第二步:
==目的:拿到
object基类==- 用
__bases__[0]拿到基类:
>>> ''.__class__.__bases__[0]<class 'object'>- 用
__base__拿到基类:
>>> ''.__class__.__base__
#<class 'object'>- 用
__mro__[1]或者__mro__[-1]拿到基类:
>>> ''.__class__.__mro__[1]#<class 'object'>>>> ''.__class__.__mro__[-1]#<class 'object'>第三步:
==目的:用
__subclasses__()拿到子类列表==>>> ''.__class__.__bases__[0].__subclasses__()#...一大堆的子类第四步:
==目的:在子类列表中找到可以getshell的类==
先知晓一些可以getshell的类,然后再去跑这些类的索引,原理是先遍历所有子类,然后再遍历子类的方法的所引用的东西,来搜索是否调用了我们所需要的方法
那么来看看这题
首先扫出来console,访问发现是python的debug,然后有意料之外发现id的注入点
输入这个
''.__class__.__bases__[0].__subclasses__()拿到:

跑出来直接发就行:
- 作者:moyaoxue
- 链接:https://moyaoxue.de/article/14425ac9-6ea8-8074-817b-f58137b76bf7
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

