15.Json.Net反序列化点(中篇)以及更多相关链

2024-11-01 11:46   广东  

1.GetterSettingsPropertyValue链

也是Json.Net很有牌面的专属链,而且看它也支持PropertyGrid、ComboBox、ListBox、CheckedListBox,不难猜测又是通过get触发的链子。来到

System.Configuration.SettingsPropertyValue

注意它的两个属性,一个是SerializedValue,在它的set中给_serializedValue赋值

另一个是PropertyValue,其get里调用了Deserialize()方法

跟进Deserialize()方法

这里判断SerializedValue属性的值是否为string,我们在对SerializedValue赋值的时候,只要给他一个byte[]类型的值,在这一步就会走到BinaryFormatter的反序列化操作。

可以看到这个又是一个非常典型的先通过set设置payload,再通过PropertyGrid、ComboBox、ListBox、CheckedListBox触发get实现反序列化的链子,就非常适配Json.Net。我们来看看Ysoserial生成的链子

就很显然了,给SettingsPropertyValue的SerializedValue赋值,类型为Byte[],内容就是binaryformatter相关的payload。然后还是用ComboBox去触发get,运行也是成功RCE


2.GetterCompilerResults

这个说是可以从本地或远程加载DLL,但是我没复现成功

这个类有一个CompiledAssembly属性,get方法会触发Assembly.LoadFile(),传参来自本类的PathToAssembly属性

也是先用set给PathToAssembly赋值,然后设法触发CompiledAssembly的get,ysoserial给出的payload如下:


3.BaseActivationFactory链

需要下面这样的dll依赖(Microsoft.WindowsDesktop.App相关)

这个我本地也没有复现成功,Ysoserial.net生成的payload倒是很简单:

这个类的构造方法接受两个String传参,其中typeNamespace传参会进入DllModule.Load()方法,并且拼接上.dll后缀,应该是这一行触发dll的加载,不过这里应该是得用C/C++写的dll才能触发

关于后面这俩链子更详细的复现可以参考:

https://exp10it.io/2024/02/dotnet-insecure-serialization/

或者直接参考原文:

https://github.com/thezdi/presentations/blob/main/2023_Hexacon/whitepaper-net-deser.pdf

此外后面这俩链子都有挺多限制:


4.参考

https://exp10it.io/2024/02/dotnet-insecure-serialization/https://github.com/thezdi/presentations/blob/main/2023_Hexacon/whitepaper-net-deser.pdf

HW专项行动小组
大师!教我打攻防
 最新文章