.NET 反序列化漏洞最新gadget链 GetterSecurityException
字数 1813 2025-08-23 18:31:08

.NET反序列化漏洞利用:GetterSecurityException Gadget链分析

1. 漏洞背景

本教学文档详细分析2023年Hexacon会议上发表的.NET反序列化最新利用链,重点介绍GetterSecurityException gadget。该漏洞利用System.Security.SecurityException类和System.Windows.Forms.PropertyGrid控件的特性构造反序列化攻击链。

2. 核心组件分析

2.1 SecurityException类

System.Security.SecurityException位于mscorlib.dll程序集,用于处理应用程序执行需要特定权限但权限不足或与CAS策略冲突时的异常。

关键属性:Method

  • Getter:调用内部方法this.getMethod()
  • Setter:通过ObjectToByteArray方法将对象转换为字节数组

ObjectToByteArray方法分析

通过反编译可知:

  • 内部使用BinaryFormatter.Serialize将对象序列化为MemoryStream
  • 通过ToArray方法返回byte[]类型

ByteArrayToObject方法

  • ObjectToByteArray相反,用于反序列化操作
  • 当访问SecurityException对象的Method属性时,会触发getMethod()方法
  • getMethod()通过BinaryFormatter反序列化对象

利用点:攻击者可通过控制Method属性的setter赋值方式添加BinaryFormatter攻击载荷,在调用getter时触发反序列化漏洞。

2.2 PropertyGrid控件

System.Windows.Forms.PropertyGrid是Windows Forms中的控件,用于创建属性窗格,便于用户查看和编辑对象属性值。

关键属性:SelectedObjects

  • 通过setter设置SelectedObjects属性时会触发复杂操作
  • 核心触发路径:
    • 调用Refresh()方法
    • 触发RefreshPropertiesUpdateSelectionCreateChildren等方法
    • 进入GridEntry.GetPropEntries

GetPropEntries方法行为

  • 迭代对象的成员
  • 通过PropertyDescriptor2.GetValue方法获取每个成员值
  • 此过程会调用每个成员的访问器getter

3. 漏洞利用链构造

结合上述两条链路的原理,构造恶意反序列化攻击代码:

3.1 完整Payload结构

payload = @"
{
    '$type':'System.Windows.Forms.PropertyGrid, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
    'SelectedObjects':[" + sePayload + @"]
}";

3.2 SecurityException Payload构造

string sePayload = @"
{
    '$type':'System.Security.SecurityException',
    'ClassName':'System.Security.SecurityException',
    'Message':'Security error.',
    'InnerException':null,
    'HelpURL':null,
    'StackTraceString':null,
    'RemoteStackTraceString':null,
    'RemoteStackIndex':0,
    'ExceptionMethod':null,
    'HResult':-2146233078,
    'Source':null,
    'Action':0,
    'Method':'" + b64encoded + @"',
    'Zone':0
}";

3.3 关键点说明

  1. PropertyGrid类的SelectedObjects属性是一个数组,包含攻击载荷sePayload
  2. Method属性包含Base64编码的基于BinaryFormatter生成的攻击载荷
  3. 最终通过JSON.NET完成整条攻击链路的反序列化

4. 攻击流程总结

  1. 攻击者构造恶意SecurityException对象,在Method属性中嵌入Base64编码的攻击载荷
  2. 将该对象作为PropertyGrid控件的SelectedObjects属性值
  3. 当反序列化该PropertyGrid对象时:
    • 触发SelectedObjects属性的setter操作
    • 调用Refresh()方法并最终触发GetPropEntries
    • 访问SecurityException对象的Method属性getter
    • 触发BinaryFormatter反序列化执行攻击载荷

5. 防御建议

  1. 避免使用不安全的序列化器如BinaryFormatter
  2. 实施严格的输入验证
  3. 使用安全的序列化替代方案如System.Text.Json
  4. 实施代码访问安全策略限制危险操作
  5. 及时更新.NET框架和安全补丁

6. 参考实现

基于Ysoserial.Net的代码实现,攻击者可构造类似上述payload的恶意对象,通过反序列化触发命令执行(如启动计算器进程)。

.NET反序列化漏洞利用:GetterSecurityException Gadget链分析 1. 漏洞背景 本教学文档详细分析2023年Hexacon会议上发表的.NET反序列化最新利用链,重点介绍 GetterSecurityException gadget。该漏洞利用 System.Security.SecurityException 类和 System.Windows.Forms.PropertyGrid 控件的特性构造反序列化攻击链。 2. 核心组件分析 2.1 SecurityException类 System.Security.SecurityException 位于 mscorlib.dll 程序集,用于处理应用程序执行需要特定权限但权限不足或与CAS策略冲突时的异常。 关键属性:Method Getter :调用内部方法 this.getMethod() Setter :通过 ObjectToByteArray 方法将对象转换为字节数组 ObjectToByteArray方法分析 通过反编译可知: 内部使用 BinaryFormatter.Serialize 将对象序列化为 MemoryStream 通过 ToArray 方法返回 byte[] 类型 ByteArrayToObject方法 与 ObjectToByteArray 相反,用于反序列化操作 当访问 SecurityException 对象的 Method 属性时,会触发 getMethod() 方法 getMethod() 通过 BinaryFormatter 反序列化对象 利用点 :攻击者可通过控制 Method 属性的setter赋值方式添加 BinaryFormatter 攻击载荷,在调用getter时触发反序列化漏洞。 2.2 PropertyGrid控件 System.Windows.Forms.PropertyGrid 是Windows Forms中的控件,用于创建属性窗格,便于用户查看和编辑对象属性值。 关键属性:SelectedObjects 通过setter设置 SelectedObjects 属性时会触发复杂操作 核心触发路径: 调用 Refresh() 方法 触发 RefreshProperties 、 UpdateSelection 、 CreateChildren 等方法 进入 GridEntry.GetPropEntries GetPropEntries方法行为 迭代对象的成员 通过 PropertyDescriptor2.GetValue 方法获取每个成员值 此过程会调用每个成员的访问器getter 3. 漏洞利用链构造 结合上述两条链路的原理,构造恶意反序列化攻击代码: 3.1 完整Payload结构 3.2 SecurityException Payload构造 3.3 关键点说明 PropertyGrid 类的 SelectedObjects 属性是一个数组,包含攻击载荷 sePayload Method 属性包含Base64编码的基于 BinaryFormatter 生成的攻击载荷 最终通过JSON.NET完成整条攻击链路的反序列化 4. 攻击流程总结 攻击者构造恶意 SecurityException 对象,在 Method 属性中嵌入Base64编码的攻击载荷 将该对象作为 PropertyGrid 控件的 SelectedObjects 属性值 当反序列化该 PropertyGrid 对象时: 触发 SelectedObjects 属性的setter操作 调用 Refresh() 方法并最终触发 GetPropEntries 访问 SecurityException 对象的 Method 属性getter 触发 BinaryFormatter 反序列化执行攻击载荷 5. 防御建议 避免使用不安全的序列化器如 BinaryFormatter 实施严格的输入验证 使用安全的序列化替代方案如 System.Text.Json 实施代码访问安全策略限制危险操作 及时更新.NET框架和安全补丁 6. 参考实现 基于Ysoserial.Net的代码实现,攻击者可构造类似上述payload的恶意对象,通过反序列化触发命令执行(如启动计算器进程)。