.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()方法 - 触发
RefreshProperties、UpdateSelection、CreateChildren等方法 - 进入
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 关键点说明
PropertyGrid类的SelectedObjects属性是一个数组,包含攻击载荷sePayloadMethod属性包含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的恶意对象,通过反序列化触发命令执行(如启动计算器进程)。