.NET 高级代码审计:一种绕过 GZip 叠加 BinaryFormatter 实现反序列化漏洞的技术

.NET 高级代码审计:一种绕过 GZip 叠加 BinaryFormatter 实现反序列化漏洞的技术

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

图片

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

01. GZip 基本介绍

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

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

反之,数据解压的基本用法代码如下所示。

using (var compressedStream = new MemoryStream(compressed))using (var gzip = new GZipStream(compressedStream, CompressionMode.Decompress))using (var decompressed = new MemoryStream()){    gzip.CopyTo(decompressed);    byte[] result = decompressed.ToArray();}

02. 二进制反序列类

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

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

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