一文详解python pickle中的反序列化漏洞

 更新时间:2024年06月24日 08:19:58   作者:大鲸鱼crush  
在Python里,常用的模块之一就是Pickle,它可以帮我们很方便地进行序列化和反序列化操作,,今天我们来聊聊Python里的反序列化攻击,文中通过代码示例讲解的非常详细,需要的朋友可以参考下

1. 引言

大家好,今天我们来聊聊Python里的反序列化攻击。先来看看什么是序列化和反序列化。简单来说,序列化就是把数据结构转换成字节流,这样我们就可以把数据保存到文件里或者通过网络传输。反序列化则是把这些字节流再转换回原来的数据结构。

在Python里,常用的模块之一就是Pickle。它可以帮我们很方便地进行序列化和反序列化操作。比如,你可以把一个复杂的Python对象序列化保存下来,等需要用的时候再反序列化回来。

反序列化攻击的概述

反序列化过程有漏洞:如果我们反序列化了一个不可信的数据源,那就可能引发反序列化攻击。攻击者可以在序列化的数据里嵌入恶意代码,当你反序列化这个数据时,这些恶意代码就会被执行,可能会导致数据泄露、系统崩溃,甚至让攻击者远程控制你的系统。

2. Python Pickle模块概述

Pickle的基本功能

Pickle模块是Python自带的,它主要用来序列化和反序列化Python对象。你可以用Pickle把任何Python对象(包括复杂的数据结构)保存成字节流,然后在需要的时候再加载回来。

Pickle的工作原理

Pickle的工作原理其实很简单。序列化的时候,它会把Python对象转换成字节流,反序列化的时候,它会把字节流还原成Python对象。下面我们来看几个具体的例子。

Pickle的序列化与反序列化

序列化

序列化就是把Python对象转换成字节流。我们可以用pickle.dumppickle.dumps来做这件事。pickle.dump把对象序列化后写入文件,pickle.dumps则返回一个字节流。

import pickle

# 创建一个对象
data = {'name': 'Alice', 'age': 25, 'city': 'New York'}

# 序列化对象并写入文件
with open('data.pickle', 'wb') as file:
    pickle.dump(data, file)

# 或者返回一个字节流
data_bytes = pickle.dumps(data)

反序列化

反序列化就是把字节流还原成Python对象。我们可以用pickle.loadpickle.loads来做这件事。pickle.load从文件中读取字节流并反序列化,pickle.loads则直接反序列化一个字节流。

import pickle

# 从文件中反序列化对象
with open('data.pickle', 'rb') as file:
    data = pickle.load(file)

# 或者直接反序列化一个字节流
data = pickle.loads(data_bytes)

3. 反序列化攻击的原理

攻击机制

现在我们来看看反序列化攻击是怎么回事。攻击者可以在序列化的数据里嵌入恶意代码,当你反序列化这个数据时,这些恶意代码就会被执行。换句话说,如果你从不可信的数据来源反序列化数据,就等于是给了攻击者在你系统里执行代码的机会。

攻击者可以做什么

攻击者可以利用反序列化漏洞执行任意命令、修改或窃取数据。

示例代码

为了更清楚地说明问题,我们来看一个简单的反序列化攻击示例。

import pickle
import os

# 构造恶意代码
class Malicious:
    def __reduce__(self):
        return (os.system, ('echo Hacked!',))

# 序列化恶意对象
malicious_data = pickle.dumps(Malicious())

# 反序列化时执行恶意代码
pickle.loads(malicious_data)

在这个示例中,我们创建了一个名为Malicious的类。这个类的__reduce__方法返回一个元组,第一个元素是os.system,第二个元素是要执行的命令。当我们反序列化这个对象时,os.system('echo Hacked!')会被执行,输出“Hacked!”。

详细解释

  • 构造恶意代码:我们定义了一个Malicious类,并在__reduce__方法中指定要执行的命令。
  • 序列化恶意对象:我们用pickle.dumps序列化这个恶意对象。
  • 反序列化恶意对象:当我们用pickle.loads反序列化这个对象时,__reduce__方法会被调用,并执行指定的命令。

4. 如何防范Pickle反序列化攻击

安全反序列化的原则

防范反序列化攻击的第一原则就是:避免从不可信来源反序列化。只有当你完全信任数据的来源时,才可以使用反序列化。

实际防御方法

我们来看一些具体的防御方法和代码示例。

安全的反序列化代码示例

如果必须使用Pickle进行反序列化,可以考虑重载find_class来限定范围限制反序列化的对象类型:

import pickle
import types

# 自定义Unpickler,限制可反序列化的类型
class RestrictedUnpickler(pickle.Unpickler):
    def find_class(self, module, name):
        if module == "builtins" and name in {"str", "list", "dict", "set", "int", "float", "bool"}:
            return getattr(__import__(module), name)
        raise pickle.UnpicklingError(f"global '{module}.{name}' is forbidden")

def restricted_loads(s):
    return RestrictedUnpickler(io.BytesIO(s)).load()

在这个示例中,我们自定义了一个RestrictedUnpickler类,只允许反序列化某些安全的内置类型。

使用其他安全的序列化模块(如JSON)

一个更安全的做法是使用JSON替代Pickle进行序列化和反序列化。JSON只支持基本数据类型,不会执行任意代码,因而更安全。

import json

# 序列化对象
data = {'name': 'Alice', 'age': 25, 'city': 'New York'}
data_json = json.dumps(data)

# 反序列化对象
data = json.loads(data_json)

总结

本文说明了什么是序列化和反序列化,以及Python中的Pickle模块。文中还详细解释了反序列化攻击的原理,并给出了攻击代码示例。最后讨论了如何防范Pickle反序列化攻击,并提供了一些具体的防御方法。

到此这篇关于一文详解python pickle中的反序列化漏洞的文章就介绍到这了,更多相关python pickle反序列化漏洞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Python3 lambda函数的深入浅出

    关于Python3 lambda函数的深入浅出

    今天小编就为大家分享一篇关于Python3 lambda函数的深入浅出,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python实现差分隐私Laplace机制详解

    python实现差分隐私Laplace机制详解

    今天小编就为大家分享一篇python实现差分隐私Laplace机制详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 教你怎么用PyCharm为同一服务器配置多个python解释器

    教你怎么用PyCharm为同一服务器配置多个python解释器

    当我们在服务器上创建了多个虚拟环境时,也可以在 PyCharm 中配置这些虚拟环境,方便不同的项目使用不同的环境,然而按照网上教程添加多个python解释器后,PyCharm会自动帮我们创建多个重复的服务器,本文主要给出该问题的解决方法,同时也对添加解释器做一个详细的讲解
    2021-05-05
  • Python OpenCV之常用滤波器使用详解

    Python OpenCV之常用滤波器使用详解

    OpenCV中常用的几种滤波器有:均值滤波器、中值滤波器、高斯滤波器、双边滤波器,本文将通过示例详细讲解这几种滤波器的使用,需要的可以参考一下
    2022-04-04
  • Python Matplotlib绘制多子图详解

    Python Matplotlib绘制多子图详解

    Matplotlib是Python中最受欢迎的数据可视化软件包之一,它是 Python常用的2D绘图库,同时它也提供了一部分3D绘图接口。本文将详细介绍如何通过Matplotlib绘制多子图,以及合并图例和调整子图间距,需要的可以参考一下
    2022-02-02
  • Python中时间类型的JSON数据转换

    Python中时间类型的JSON数据转换

    在Python中,处理时间和日期数据以及与JSON数据的相互转换是常见的任务,本文主要为大家详细如何在Python中处理时间类型的JSON数据转换,需要的小伙伴可以参考下
    2024-02-02
  • python实现dijkstra最短路由算法

    python实现dijkstra最短路由算法

    这篇文章主要为大家详细介绍了python实现dijkstra最短路由算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Python函数式编程中itertools模块详解

    Python函数式编程中itertools模块详解

    这篇文章主要介绍了在Python中使用itertools模块中的组合函数的教程,来自IBM官方技术文档,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • Python YAML文件的读写操作详解

    Python YAML文件的读写操作详解

    这篇文章主要介绍了Python读写yaml文件,yaml 是专门用来写配置文件的语言,非常简洁和强大,之前用ini也能写配置文件,有点类似于json格式,下面关于Python读写yaml文件的详细资料,需要的小伙伴可以参考一下
    2022-08-08
  • 在python中pandas读文件,有中文字符的方法

    在python中pandas读文件,有中文字符的方法

    今天小编就为大家分享一篇在python中pandas读文件,有中文字符的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论