0x01 漏洞描述
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
序列化:将对象转化为便于传输的格式
反序列化:将序列化的数据恢复为对象的过程
-
serialize(); 将对象序列化成字符串
-
unserialize(); 将字符串反序列化回对象
0x02 漏洞原理
序列化和反序列化本身不存在漏洞,之所以会有反序列化漏洞,是因为开发者在编写时,加入了一些恶意的代码。
序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令。
0x03 漏洞场景
反序列化漏洞在许多场景中都可能存在,尤其是在接受用户输入并进行反序列化的情况下。一些常见的场景包括从网络接收序列化数据、从数据库中读取序列化数据、接收和处理远程 API 的序列化数据等。
0x04 漏洞评级
严重
0x05 漏洞危害
反序列化漏洞的危害非常严重。攻击者可以通过构造恶意序列化数据来执行任意代码,包括远程命令执行、文件系统操作、数据库操作等。这可能导致数据泄露、服务器被入侵、用户隐私泄露等问题。
0x06 漏洞验证
0x07 漏洞利用
构造POP链:通过用户可控的反序列化操作,其中可触发的魔术方法为出发点,在魔术方法中的函数在其他类中存在同名函数,或通过传递,关联等可以调用的其他执行敏感操作的函数,然后传递参数执行敏感操作。
0x08 防御方案
- 仅接受信任的序列化数据。
- 验证和过滤输入的序列化数据,确保其符合预期的格式和结构。
- 使用安全的序列化库或框架,以减少漏洞的风险。
- 在反序列化之前对数据进行严格的验证和过滤,以防止执行恶意代码。
0x09 典型案例
反序列化之前对数据进行严格的验证和过滤,以防止执行恶意代码。
0x09 典型案例
一个典型的 PHP 反序列化漏洞案例是 CVE-2016-10033 和 CVE-2016-10045,这是由于 PHP 反序列化函数 unserialize()
在处理特定类型的数据时存在漏洞,导致远程代码执行。这些漏洞影响了较早版本的 PHP,但通过修补程序进行了修复。这些漏洞的利用可能导致服务器被入侵、敏感信息泄露等。