目录

  1. 1. 前言
  2. 2. 魔术方法
  3. 3. 魔术属性
  4. 4. 内置函数和变量

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

python特性

2023/7/6 python
  |     |   总文章阅读量:

前言

突然意识到自己对python的类,魔术方法和一些特性尚不明晰

对pyjail和ssti的解题会造成一定影响,所以这篇文章就记录一下python的一些特性

使用python的交互环境进行测试

参考春哥的文章


  • 在python中,类均继承自object基类

  • python中类本身具有一些静态方法,如bytes.fromhexint.from_bytes等。对于这些类的实例,也能调用这些静态方法

image-20230706202656682

image-20230706202836988

魔术方法

与php魔术方法类似,一些函数的实现也是直接调用魔术方法的

比较全的文档

__init__:构造函数。这个在实例化类的时候就会用到,一般是接受类初始化的参数,并且进行一系列初始化操作。

__len__:返回对象的长度,对一个对象a使用len(a)时,会尝试调用a.__len__()

image-20230706203309360

__str__:返回对象的字符串表示

image-20230706203440990

__getitem__:根据索引返回对象的某个元素

image-20230706204202915

__add____sub____mul____div____mod__:算术运算,加减乘除模

image-20230706204457047

__and____or____xor__:逻辑运算

image-20230706204624729

__eq____ne____lt____gt____le____ge__:比较运算

image-20230706204934780

__getattr__:对象是否含有某属性

__setattr__:设置属性

__subclasses__:返回当前类的所有子类

一般是用在object类中,在object.__subclasses__()中,我们可以找到os模块中的类,然后再找到os,并且执行os.system,实现RCE

os模块中定义的所有名称(大写字母开头的名称,这些名称通常是类名):

>>> dir(os)
['DirEntry', 'F_OK', 'GenericAlias', 'Mapping', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_AddedDllDirectory', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_check_methods', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_walk', '_wrap_close', 'abc', 'abort', 'access', 'add_dll_directory', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'unsetenv', 'urandom', 'utime', 'waitpid', 'waitstatus_to_exitcode', 'walk', 'write']

魔术属性

相对应地,python的类中也包含着一些魔术属性

__dict__:可以查看内部所有属性名和属性值组成的字典

image-20230706210851205

注:在python中,dict()是将类转成字典的函数,跟此魔术属性无关

__doc__:类的帮助文档

__class__:返回当前对象所属的类

''.__class__
>>> <class 'str'>
().__class__
>>> <class 'tuple'>
{}.__class__
>>> <class 'dict'>
[].__class__
>>> <class 'list'>

拿到类之后,就可以通过构造函数生成新的对象

image-20230708134518865

__base__:返回当前类的基类

''.__class__.__base__
str.__base__
>>> (<class 'object'>)

内置函数和变量

dir():查看对象的所有属性和方法

image-20230708135049899

chr()ord():字符与ASCII码转换函数

globals():返回所有全局变量的函数;

locals():返回所有局部变量的函数

__import__:载入模块的函数,例如import os = __import__('os')

__name__:该变量指示当前运行环境位于哪个模块中

__builtins__:包含当前运行环境中默认的所有函数与类,比如下面的这个int函数就是内置函数,Python解释器在启动时已经自动帮我们导入了builtins模块

image-20230919205549932

__file__:该变量指示当前运行代码所在路径,注:该变量仅在运行代码文件时会产生,在运行交互式终端时不会有此变量

_:该变量返回上一次运行的python语句结果。注:该变量仅在运行交互式终端时会产生,在运行代码文件时不会有此变量