0x00 简介
近日,Hexacon会议上安全研究员Piotr Bazydło公布了.Net反序列化的研究,其研究内容包括SolarWinds的一系列反序列化漏洞发现和黑名单的绕过,不安全的序列化利用,.net framework和.net5利用链。在.Net Framework这一方面,他把不安全的序列化gadget结合call getter gadget起来,形成了新的反序列化链,绕过了传统反序列化攻击的防护思路,扩充了攻击面。本文主要对不安全的序列化和call getter反序列化链加以介绍。
0x01不安全的序列化
设想有这样一种应用场景,服务端接收序列化的字符串,反序列化为对象obj后,对obj进行修改,然后再序列化,发给客户端。 那么可以利用的点如图所示。传递给服务器一个序列化对象,这个对象包含了恶意的getter,反序列化会正常进行,不会执行恶意操作,但当再次序列化时,便会触发getter的调用,从而造成恶意操作的执行。当然,这种场景下使用的formater都是基于setter、getter的,如Json.Net,而BinaryFormatter、SoapFormatter等不属于。这种利用方式与以往是不同的,通常反序列化链在反序列化时就触发了恶意操作,而此种利用方式是在序列化时触发恶意操作。
议题提出了3个可以在该场景下利用的序列化链:SettingsPropertyValue、SecurityException和CompilerResults。
1、 SettingsPropertyValue
该类 get_PropertyValue 方法在特定条件下会调用BinaryFormater.Deserialize(),而这个特定条件用户可以控制满足,因此可以调用任意binaryformater的gadget链。
首先Deserialized属性必须是false
其次,SerializedValue不能为string
这条链在.net core中是失败的,原因就在于下图,检查了BinaryFormatter是否被允许,而在.net5及以上,BinaryFormatter默认被禁止调用。
最终payload如下,执行便会弹计算器
原理: 反序列化器调用set_Text setter,该setter会调用Items中指定对象的指定成员getter,指定成员由DisplayMember字段设置。
set_Text如下,第一个if判断会直接为true,具体查看ComboBox构造函数。 走到红框处调用 ListControl.GetItemText ,其参数selectedItem是 Items 中的对象
GetItemText会调用FilterItemOnProperty,这个函数会从触发我们设置的DisplayMember字段对应的getter
Find函数根据DisplayMemeber寻找PropertyDescriptor
GetValue则会触发DisplayMemeber的getter
System.Windows.Forms.ListBox、System.Windows.Forms.CheckedListBox 和ComboBox几乎一样。
把4个call getter gadget和2个序列化gadget结合起来,就可以形成常规的反序列化利用链。ysoserial.net工具已经实现了上述利用方式,对应GetterCompilerResultsGenerator、GetterSecurityExceptionGenerator、GetterSettingsPropertyValueGenerator。
0x03 总结
白皮书关于序列化与反序列化的大部分内容是基于.Net Framework的,它提到在.Net Core中,序列化链利用存在诸多限制,目前只有在WPF或引入了PresentationFramework.dll的情况下,存在反序列化利用链,web应用尚不存在或未公开。但在后续研究中,可以考虑从影响力大的、流行度高的第三方库入手,寻找漏洞。
参考连接
https://github.com/thezdi/presentations/blob/main/2023_Hexacon/whitepaper-net-deser.pdf
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)