Python 和 SSTI
Python 和 PHP 一样,也有很多系统定义属性和方法,这些属性和方法是不需要自己定义的,在Python里面系统自动拥有的属性和方法。
这些方法和属性的访问方式是 ___XXX___
。全部是基于类的调用。
类的保留属性
类的保留属性,也就是当我们声明一个类的时候,这个类会自动生成下面的属性,里面记录着这个类的各种信息。
__doc__
此属性记录这类的描述信息(描述信息往往是声明类的时候写的:)类和实例都有效
1 | class Xorex(): |
上面就会输出语句:This is a class discribing about Xorex!
__name__
此属性记录着类的名称,仅仅类有效
1 | class Xorex(): |
__module__
此属性记录着类所在的模块(如果类在主程序定义,返回__main__
,否则返回类定义所在的模块/文件名),类和实例都有效。__dict__
记录着这个类的所有成员信息(包括系统定义的以及自己声明的类的属性和方法)。只对类和实例还有模块有效,以下是对一个空类 Tempest() 的__dict__
属性保存的信息。
1 | {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Tempest' objects>, '__weakref__': <attribute '__weakref__' of 'Tempest' objects>, '__doc__': None} |
__class__
此属性记录着实例的类的信息,可以用这个把属性来当作实例来使用。
类的基础方法
这个东西和 php 的魔术方法非常像,这些方法在不同情况下会被自动执行
__init__()
在初始化实例的时候自动执行。__repr__()
是 表象 representation 的缩写,当使用 repr() 来展示一个类的信息的时候,会自动执行。__str__()
当类的实例被当作字符串处理的时候,会自动执行这个方法,这个方法必须返回字符串。__bytes__()
当被当作自己处理的时候,自动执行的方法。
SSTI
先知上面有大佬说 SSTI 更适合被称呼为 Python继承链,我也觉得这种说法非常正确。(啊,好像是三叶草的师傅)
SSTI的思路就是在执行 Python 的代码注入的时候,因为没有继承的类都会包括基类。而基类中有很多子类,子类中有各种各样的属性和方法,我们可以利用构造继承链来调用各种各样的函数,从而实现我们的目的。
(基类:包含所有实体共性的 class 类)
首先需要各种前置知识:
1. __class__
返回一个实例所属与的类。
2. __bases__
返回这个类的父类(如果没有继承其他类的话,会自动继承基类 object,我们就需要利用这个基类 object)。所以我们可以根据返回的父类,来调用基类 object
我们可以用 ''.__class__.__bases__[1]
来得到基类
3. __mro__
这个东西的用法是和 __bases__
是相同的,不同的是,__mro__
是返回这个类的父类的调用顺序(类似于检索方法和属性的顺序),这样也同样达到了列出父类的获取 object 的目的。
4. __globals__
这是一个全局属性,用来返回当前函数的空间下能使用的模块,方法,变量。需要在前面配合着函数使用。
5. __subclasses__()
全局方法,获取一个类的子类并且返回,主要是针对 object 基类使用,用来查看基类的各种各样的子类,来找到合适的使用。
6. __builtins__
返回内建函数的列表。
内建函数,python已经有的函数,可以直接调用,比如 abs(),max() 等等,这些都是内建函数,都可以通过 __builtins__
进行查看。
7. dir()
返回参数的属性,方法列表。一般是用来查看基类 object 的子类中有没有什么可以利用的方法,使用 dir() 列出来查看。