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