1.前言
前面学习了和Json.Net有关的几个链子,比如:
SecurityException
SettingsPropertyValue
GetterCompilerResults
BaseActivationFactory
这些链子有一个特性,就是他们内部都有一些特殊属性,在set时设置payload,在get时触发恶意操作。因此我们先通过set方法设置payload,再通过一些能触发get的set行为去实现攻击。
当然还学习了XamlImageInfo相关链子,利用起来比较简单。
上述这些姿势其实都出自:
https://github.com/thezdi/presentations/blob/main/2023_Hexacon/whitepaper-net-deser.pdf
除了上面提到的这些东西,这篇文章里还介绍了一些姿势,本文给补齐来。
2.使用特性设置TypeNameHandling时对攻击造成的影响
我们前面使用TypeNameHandling的时候,基本都是把它通过DeserializeObject()传入的。这里还介绍了一种情况就是用下面的特性去传入
[JsonProperty]
这和我们使用DeserializeObject()传入有什么不同呢?答案是这会直接使反序列化链不生效,因为此时TypeNameHandling.All只对第一个反序列化对象有效,后续还是TypeNameHandling.None。比方说我们用PropertyGrid+SettingsPropertyValue构造反序列化链子,从payload上来看就是PropertyGrid里面套一个SettingsPropertyValue,然而只有PropertyGrid能够按All的规则反序列化成功,SettingsPropertyValue走的是None,自然会被影响。
3.不借助ObjectDataProvider进行任意函数调用的Xaml写法
这样一个超简单的payload,通过FactoryMethod可以调用目标类的几乎任何方法,因此不需要ObjectDataProvider也依然可以用Process.Start()执行系统命令
如果目标对ObjectDataProvider做了匹配和拦截,可以考虑用这个姿势去绕过。
4.PictureBox反序列化SSRF点
一个无回显的SSRF点,但支持smb,在内网里有可能用来触发NTLM Realy
这个点发生在PictureBox的ImageLocation属性的set,其中调用了Load()方法
这里会对传入的路径做判断,如果是远程路径,那么调用OpenRead()方法
下个断点:
这个方法里就发起请求了
5.InfiniteProgressPage反序列化SSRF点
问题主要发生在下面这个类
Microsoft.ApplicationId.Framework.InfiniteProgressPage
其AnimatedPictureFile属性的set
注意到这里有一个Load方法的调用
Load方法
这里实际上是调用PictureBox的Load()方法,上文我们已经分析过了
6.FileLogTraceListener反序列化创建目录(DOS)
这个CustomLocation的set中会对传入的目录进行判断,如果不存在那么会进行一个创建。有部分漏洞的利用可能需要我们创建目录,比方说Mysql的UDF提权,再比如说部分解析漏洞需要依靠特殊的文件夹名字。或许可以用这个姿势组合,不过实战中估计比较难打出来。
运行上述代码,成功创建目录
此外Windows下的任意目录创建是可以导致DOS问题的,参考这篇文章:
https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks
只要创造
C:WindowsSystem32cng.sys
这样一个文件夹,就会造成DOS问题。
原文始发于微信公众号(HW专项行动小组):16.whitepaper-net-deser补充学习(Json.Net后篇)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论