一、反序列化漏洞与新式类

在pickle和cPickle以及shelve这三个序列化类中,想要构造反序列化漏洞执行命令或者代码,都需要用到新式类。

shelve其实底层就是调用的pickle和cPickle,不过是在此基础上加了一层封装罢了。

而且要用到__reduce__这个魔法函数:

 class A(object):
def __reduce__(self):
do_something()

这个魔法函数当反序列化时候对返回一个元祖,其中第一个是可调用的对象,第二个是可调用对象的参数对象,这个返回值在反序列化时候会被执行。

为什么必须是新式类呢,看一下这个代码就知道了

 class human1():
def __init__(self):
pass class human2(object):
def __init__(self):
pass h1 = human1()
h2 = human2()
print dir(h1)
print dir(h2) """
['__doc__', '__init__', '__module__']
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
"""

因为经典类默认是没有__reduce__的,新式类默认有,目的就是为了帮助pickle,你重写才有意义。

当然类本事也可以作为参数,也可序列化反序列化,但是还没找到哪一个内置函数会在类本身被反序列话的时候运行,就像对于实例来说的__reduce__一样。

二、关于python的反射特性和自醒特性:

大家都知道在java中关于invoker的相关东西,为java反序列化构造反射链立下了汗马功劳,在python中也有类似的功能设计。

这里要涉及到python的一个模块:inspect,起作用与java的反射特点类似。

首先看一下类和实例的创建

1、对于类:

 class myclass1(object):
def __init__(self,*args,**kwargs):
do_something()
myclass2 = myclass1
myclass3 = myclass1.__class__
myclass4 = pickle.loads(pickle.dumps(myclass1))
myclass5 = getattr(sys.modules[__name__],'myclass1')

2、对于实例:

 a = myclass1(1)
a = eval("{0}({1})".format("myclass1",""))
a = cPickle.loads(cPickle.dumps(myclass1))(2)
a = getattr(sys.modules[__name__],'myclass1')(3)

上面的都成创建实例。

注:python的eval是代码执行的函数,类似php

 eval("os.system('id')")

当然还有一种方法创建实例和类就是globals()[myclass1]()创建类,globals()[myclass1]()(5)创建实例。

3、下面正式来讲反射,三要素,获取类,获取方法、执行

3.1、获取类:

3.1.1、获取本身的类:

 #对象实例obj
obj.__class__

3.1.2、获取父类

 #实例对象obj,类myclass
#一层继承:返回tuple
obj.__class__.__bases__
myclass.__bases__
#多层继承:
obj.__class__.__bases__[0].__bases__
myclass.__bases__[0].__bases__

3.2、获取属性和方法:

3.2.1、获取方法名字:

 #obj实例对象名称或者类名称
dir(obj)

3.2.1 验证存在性与获取属性方法

 #obj为实例或者类对象
#判断是否存在
hasattr(obj,"run")
#获取:
getattr(obj,"run")
#返回属性或者函数对象可以调用
#设置:
setattr(obj,"flag","")
#obj.flag = 1
def func():
os.system("id")
setattr(obj,"func",func)
#调用可以obj.func()
def func(obj):
this = obj
do_something(this)
setattr(obj,"func",func)
obj.func(obj)

3.3调用:

 #调用属性:
getattr(obj,"name")
#调用方法:
getattr(obj,"func")()

知道了2中的种种,其实python也是可以构造自己的反射链的。

三、反序列化与getattribute和getattr函数

之前的博客提到了pyyaml的反序列化漏洞就是由getattr()引起的,获得了函数并执行,导致了被攻击。

在返序列化中遇到getattribute,他是getattr的新式类版本,下面来看对于类和对象上这两个函数的区别

1 对于类:

 class person(object):
def run(self):
import os
os.system("id")
getattr(person,"run")(person())
person.__getattribute__(person,"run")(person())

2、对于对象:

 class person(object):
def __init__(self,):
pass
def run(self):
os.system("id")
p = person()
print getattr(p,"run")()
print p.__getattribute__("run")()

以上都可以导致命令执行,或者代码执行。

这样python的反序列化其实就和java的差不多了,java有很多中间件,都是大项目,如果python也有这样的组件家族的话相信,会有复杂的反射链和多种利用方式,从目前来看,对于python发序列化漏洞比较多的还是web,所以使用base64和xml等传输,会导致这类漏洞,需要特别注意。

关于python类型创建、反射(自醒)与反序列化的更多相关文章

  1. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  2. Python 异常处理与反射机制

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  3. python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

    一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  4. python中的反射

    在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...

  5. JAVA类型信息——反射机制

    JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...

  6. Python之路- 反射&定制自己的数据类型

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...

  7. Python Python中的反射机制

    Python中的反射机制 by:授客 QQ:1033553122 概念 借用java中的定义:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方 ...

  8. Python 类型和对象(转)

    译文:http://wiki.woodpecker.org.cn/moin/PyTypesAndObjects 原文:http://www.cafepy.com/article/python_attr ...

  9. Python之面向对象反射

    Python之面向对象反射 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 ...

随机推荐

  1. java dom xml解析和windows dom解析的差别

    1.java dom 子节点包括空节点. 2.java dom 文档节点值也是其的子节点. 而windows dom(mshtml.dll)子节点不包括空节点,而节点值也不是以子节点的方式来对待的.

  2. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  3. struts2 s:set标签

    set标签是将某个值放到指定范围内, 比如说 student.teacher.parent.age 每次访问这个属性不仅性能低,而且代码可读性很差,为了解决这个问题,可以将这个值设置为一个新值,并且放 ...

  4. 让 Node.js 支持 ES6 的语法

    为了让 Node.js 支持 ES6 的语法, 需要使用 Babel. 安装 es-checker 在使用 Babel 之前 , 我们先检测一下当前 node 对 es6 的支持情况. 在命令行下执行 ...

  5. Android - 资源(resource)转换为String

    资源(resource)转换为String 本文地址: http://blog.csdn.net/caroline_wendy Android建议资源的动态绑定, 即把string写入资源内, 然后运 ...

  6. python核心编程——python对象

    一.什么是python对象 在python中,构造的不论什么类型的值都是一个对象.比方一个整数类型的值,一个字符串.一个列表等,都能够看做是对象. 全部的对象分为三部分: (1)身份.每一个对象都有个 ...

  7. int、char、long各占多少字节数

    Java基本类型占用的字节数:1字节: byte , boolean2字节: short , char4字节: int , float8字节: long , double 编码与中文:Unicode/ ...

  8. C++之extern关键字

    extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...

  9. 基于css3的鼠标经过动画显示详情特效

    之前为大家分享过一款基于jquery的手风琴显示详情,今天给大家分享基于css3的鼠标经过动画显示详情特效.这款实例鼠标经过的时候基于中间动画放大,效果非常不错,效果图如下: 在线预览   源码下载 ...

  10. inline-block元素的空白间距解决方法<转>

    使用inline-block来代替float进行布局,或者使用inline-block来实现元素的居中效果.有关于使用inline-block来代替float的讨论也蛮多的. 不过就是使用inline ...