Python 和 PHP 一样,也有很多系统定义属性和方法,这些属性和方法是不需要自己定义的,在Python里面系统自动拥有的属性和方法。

这些方法和属性的访问方式是 ___XXX___ 。全部是基于类的调用。

类的保留属性

类的保留属性,也就是当我们声明一个类的时候,这个类会自动生成下面的属性,里面记录着这个类的各种信息。

  1. __doc__ 此属性记录这类的描述信息(描述信息往往是声明类的时候写的:)类和实例都有效
1
2
3
4
5
class Xorex():
'This is a class discribing about Xorex!'
pass

print(Xorex.__doc__)

上面就会输出语句:This is a class discribing about Xorex!

  1. __name__ 此属性记录着类的名称,仅仅类有效
1
2
3
4
5
6
7
8
class Xorex():
'This is a class discribe about Xorex!'
pass

Person=Xorex()

print(Person.__class__.__name__)
print(Xorex.__name__)
  1. __module__ 此属性记录着类所在的模块(如果类在主程序定义,返回 __main__,否则返回类定义所在的模块/文件名),类和实例都有效。

  2. __dict__ 记录着这个类的所有成员信息(包括系统定义的以及自己声明的类的属性和方法)。只对类和实例还有模块有效,以下是对一个空类 Tempest() 的__dict__ 属性保存的信息。

1
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Tempest' objects>, '__weakref__': <attribute '__weakref__' of 'Tempest' objects>, '__doc__': None}
  1. __class__ 此属性记录着实例的类的信息,可以用这个把属性来当作实例来使用。

类的基础方法

这个东西和 php 的魔术方法非常像,这些方法在不同情况下会被自动执行

  1. __init__() 在初始化实例的时候自动执行。
  2. __repr__() 是 表象 representation 的缩写,当使用 repr() 来展示一个类的信息的时候,会自动执行。
  3. __str__() 当类的实例被当作字符串处理的时候,会自动执行这个方法,这个方法必须返回字符串。
  4. __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() 列出来查看。