.NET 高级代码审计:一种尚未公开绕过 GZip 实现反序列化漏洞的方法

.NET 高级代码审计:一种尚未公开绕过 GZip 实现反序列化漏洞的方法

原创 专攻.NET安全的 dotNet安全矩阵 2025-04-23 00:28

图片

在.NET反序列化漏洞审计与利用过程中,攻击者通过 BinaryFormatter
 类型进行 payload 加载与执行。本文将从 GZip 技术基础出发,逐步分析如何结合 BinaryFormatter 触发反序列化漏洞,并介绍审计过程中常见的绕过点。

01. GZip 基本介绍

在 .NET 中,GZipStream
 类位于 System.IO.Compression
 命名空间下,它提供了对 GZip 格式的压缩与解压支持。常用于对数据进行空间优化存储或传输,数据压缩的基本用法代码如下所示。

byte[] rawData = Encoding.UTF8.GetBytes("Hello, world!");using(var ms =newMemoryStream()){using(var gzip =newGZipStream(ms, CompressionMode.Compress)){        gzip.Write(rawData,0, rawData.Length);}byte[] compressed = ms.ToArray();}

压缩完后,把 MemoryStream 里的内容转成 byte[]

02. 二进制反序列类

BinaryFormatter 是 .NET 中的二进制序列化类,将任意 [Serializable] 标记的对象进行序列化与反序列化,包括复杂对象图。

BinaryFormatter bf =newBinaryFormatter();object obj = bf.Deserialize(stream);

BinaryFormatter 是.NET中最典型的高危反序列化接口之一。只要攻击者能够控制输入的序列化流内容,即可构造触发器(Gadget),造成远程代码执行、任意文件读写、命令注入等攻击。

03. 两者叠加分析绕过

在一些 Web 应用中,开发者可能对输入流进行了压缩处理,例如读取本地缓存、配置文件等场景。