点击蓝字
关注我们
始于理论,源于实践,终于实战
老付话安全,每天一点点
激情永无限,进步看得见
严正声明
本号所写文章方法和工具只用于学习和交流,严禁使用文章所述内容中的方法未经许可的情况下对生产系统进行方法验证实施,发生一切问题由相关个人承担法律责任,其与本号无关。
特此声明!!!
什么是不安全反序列化
不安全反序列化是指在反序列化过程中存在潜在安全风险的情况。当应用程序接受用户可控的序列化数据并进行反序列化时,攻击者可能会通过构造恶意的序列化数据来操纵反序列化后的对象,从而导致执行恶意代码或触发其他不受控制的行为。甚至可以将序列化对象替换为完全不同类的对象。网站可用的任何类的对象都可以被反序列化和实例化。
主要造成的风险:
-
远程代码执行:攻击者可以通过构造恶意序列化数据注入和执行任意代码,从而完全控制目标系统,并执行恶意操作。
-
拒绝服务(DoS)攻击:攻击者可以发送恶意序列化数据来触发异常或消耗过多的系统资源,导致系统崩溃或无法提供正常的服务。
攻击步骤:
-
序列化对象:创建一个对象并将其序列化为字节流。
-
构造恶意数据:通过修改序列化后的字节流(或文本),构造恶意的序列化数据。
-
反序列化数据:将恶意构造的序列化数据传递给应用程序进行反序列化,观察是否能够触发预期的安全问题。
常见的不安全反序列化情况:
-
不受限制的反序列化:如果反序列化操作没有适当的验证和限制,允许任意的序列化数据被反序列化,攻击者可以构造恶意的序列化数据来执行恶意代码。
-
未经过滤的输入:如果反序列化操作接受未经过滤的输入数据,攻击者可以通过构造特定的恶意数据来执行命令或导致不受控制的行为。
-
自定义的反序列化逻辑:如果使用自定义的反序列化逻辑而不是使用安全的序列化库或框架,可能会导致安全问题。自定义逻辑可能缺乏必要的安全验证和过滤步骤,从而容易受到攻击。
-
恶意的序列化数据:如果攻击者能够在反序列化操作中提供恶意构造的序列化数据,可能会导致命令执行或其他不受控制的行为。
反序列化漏洞案例分析:
Java反序列化漏洞是一种严重的安全问题,它允许攻击者通过构造恶意的序列化数据来执行任意代码。以下是一些著名的Java反序列化漏洞案例分析:
1. Apache Commons Collections漏洞
Apache Commons Collections是一个广泛使用的Java库,其中包含了一些可以被反序列化用来实现任意代码执行的类。通过构造恶意的序列化数据,可以利用这个库中的类来执行任意代码。这个漏洞被广泛应用于攻击各种Java应用程序,包括WebLogic、WebSphere、JBoss、Jenkins和OpenNMS等。
漏洞利用
攻击者可以通过发送恶意构造的序列化数据来触发这个漏洞,从而在受害者的系统上执行任意代码。具体来说,攻击者可以利用TransformedMap类中的装饰函数decorate()来构造一个恶意的Map对象,当这个对象被反序列化时,会自动调用恶意代码。
2. WebLogic反序列化漏洞
Oracle WebLogic Server是一个广泛使用的Java EE应用程序服务器。WebLogic Server在处理反序列化数据时存在安全漏洞,允许攻击者通过构造恶意的序列化数据来执行任意代码。
漏洞利用
攻击者可以通过发送恶意构造的序列化数据到WebLogic Server,从而触发这个漏洞,执行任意代码。具体的利用方式包括构造恶意的JRMP(Java Remote Method Protocol)请求。
3. Jenkins反序列化漏洞
Jenkins是一个开源的自动化服务器,广泛用于持续集成和持续交付。Jenkins在处理反序列化数据时存在安全漏洞,允许攻击者通过构造恶意的序列化数据来执行任意代码。
漏洞利用
攻击者可以通过发送恶意构造的序列化数据到Jenkins服务器,从而触发这个漏洞,执行任意代码。具体的利用方式包括构造恶意的Job对象,然后通过反序列化来执行恶意代码。
Python中的反序列化攻击
Python中的pickle模块也存在反序列化攻击的风险。攻击者可以通过构造恶意的序列化数据来执行任意代码。pickle模块在反序列化过程中会自动调用对象的构造函数或方法,攻击者可以利用这一点来执行恶意代码。
不安全的反序列化漏洞是如何产生的
不安全的反序列化通常是因为缺乏对反序列化用户可控数据的危险性的理解。理想情况下,用户输入根本不应该被反序列化。因为对反序列化的数据实施了某种形式的附加检查,但这种方法通常是无效的,因为它们依赖于在数据反序列化后检查数据,在许多情况下,这为时已晚,无法防止攻击。
在使用具有二进制序列化格式的语言时,开发人员可能会认为用户无法有效地读取或操作数据。但攻击者利用二进制序列化对象的可能性与利用基于字符串的格式一样。
一个典型的站点可能会使用许多不同的库,每个库也有自己的依赖项。这会产生一个难以安全管理的大量类和方法池。攻击者可以创建这些类中的任何一个的实例,因此很难预测可以对恶意数据调用哪些方法。如果攻击者能够将一长串意外的方法调用链接在一起,将数据传递到与初始源完全无关的接收器中,就会造成攻击。
END
老付
欢迎扫码
关注我们
网络安全
原文始发于微信公众号(老付话安全):不安全的反序列化object injection漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论