使用Python验证并利用Redis未授

文章来源|MSWeb高级攻防第3期作业

本文作者:huang(Web高级攻防3期学员)

Python序列化与反序列化原理

Python序列化是将Python对象及其所拥有的层次结构转化为一个字节流的过程,反序列化是将字节流转化回一个对象层次结构。

Python对象序列化模块间的关系

在python中通常使用json、pickle/cPickle以及marshal、shelve等方式进行序列化和反序列化操作。

模块名称描述提供的apijson用于实现Python数据类型与通用(json)字符串之间的转换dumps()、dump()、loads()、load()pickle/cPickle用于实现Python数据类型与Python特定二进制格式之间的转换。pickle或cPickle两者只是实现的语言不同,一个是纯Python实现、另一个是C实现,函数调用基本相同。dumps()、dump()、loads()、load()marshalmarshal负责在Python数值与二进制字节对象之间进行转换的。marshal的存在主要是为了支持Python的.pyc文件。dumps()、dump()、loads()、load()shelveshelve模块是一个简单的以k,v结构将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型open()

一般pickle是序列化Python对象时的首选。

pickle与json模块的比较

1.JSON是一个文本序列化格式(它输出unicode文本,尽管在大多数时候它会接着以utf-8编码),而pickle是一个二进制序列化格式;2.JSON是我们可以直观阅读的,而pickle不是;3.JSON是可互操作的,在Python系统之外广泛使用,而pickle则是Python专用的;4.默认情况下,JSON只能表示Python内置类型的子集,不能表示自定义的类;但pickle可以表示大量的Python数据类型(可以合理使用Python的对象内省功能自动地表示大多数类型,复杂情况可以通过实现specificobjectAPIs来解决)。5.JSON对一个不信任的JSON进行反序列化的操作本身不会造成任意代码执行漏洞。而pickle模块并不安全。你只应该对你信任的数据进行反序列化操作。构建恶意的pickle数据来在解封时执行任意代码是可以实现的的。下面我们重点讲解pickle模块如何实现反序列化。

Pickle模块序列化与反序列化pickle序列化与反序列化函数函数说明dumps对象反序列化为bytes对象dump对象反序列化到文件对象,存入文件loads从bytes对象反序列化load对象反序列化,从文件中读取数据

与PHP序列化相似,Python序列化也是将对象转换成具有特定格式的字符串(python2)或字节流(python3),以便于传输与存储

python2和python3执行pickle模块

python2执行结果python3执行结果同样的代码,得到的结果完全不同。这就涉及到了PVM,因为它是Python序列化过程和反序列化过程中最根本的东西。具体可参考

python2执行结果字符的特殊含义如下

符号说明含义c读取新的一行作为模块名module,读取下一行作为对象名object,然后将module.object压入到堆栈中导入模块及其具体对象,nt-windows,posix-linux(将一个标记对象插入到堆栈中。为了实现我们的目的,该指令会与t搭配使用,以产生一个元组左括号t从堆栈中弹出对象,直到一个“(”被弹出,并创建一个包含弹出对象(除了“(”)的元组对象,并且这些对象的顺序必须跟它们压入堆栈时的顺序一致。然后,该元组被压入到堆栈中相当于),与(组合构成一个元组R将一个元组和一个可调用对象弹出堆栈,然后以该元组作为参数调用该可调用的对象,最后将结果压入到堆栈中标识反序列化时根据reduce中的方式完成反序列化,会避免报错(漏洞点)S读取引号中的字符串直到换行符处,然后将它压入堆栈代表一个字符串P后面接一个数字,标识第N块堆栈如p0,p1.将一个元组和一个可调用对象弹出堆栈,然后以该元组作为参数调用该可调用的对象,最后将结果压入到堆栈中。标识结束

python3执行结果字符的特殊含义如下(因为我是用的python是最新的3.10版本,所以默认协议为4.参考链接:


转载请注明:http://www.aierlanlan.com/tzrz/700.html