千家信息网

JavaScript Serializer反序列化漏洞是怎样的

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,JavaScript Serializer反序列化漏洞是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、前言在.NET处理 Aj
千家信息网最后更新 2026年11月01日JavaScript Serializer反序列化漏洞是怎样的

JavaScript Serializer反序列化漏洞是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、前言

在.NET处理 Ajax应用的时候,通常序列化功能由JavaScriptSerializer类提供,它是.NET2.0之后内部实现的序列化功能的类,位于命名空间System.Web.Script.Serialization、通过System.Web.Extensions引用,让开发者轻松实现.Net中所有类型和Json数据之间的转换,但在某些场景下开发者使用Deserialize 或DeserializeObject方法处理不安全的Json数据时会造成反序列化攻击从而实现远程RCE漏洞。笔者从原理和代码审计的视角做了相关介绍和复现。

前文回顾:

.NET高级代码审计之XmlSerializer反序列化漏洞

.NET高级代码审计(第二课) Json.Net反序列化漏洞

.NET高级代码审计(第三课)Fastjson反序列化漏洞

二、JavaScriptSerializer序列化

下面先来看这个系列课程中经典的一段代码:

TestClass类定义了三个成员,并实现了一个静态方法ClassMethod启动进程。序列化通过创建对象实例分别给成员赋值

使用JavaScriptSerializer类中的Serialize方法非常方便的实现.NET对象与Json数据之间的转化,笔者定义TestClass对象,常规下使用Serialize得到序列化后的Json

从之前介绍过其它组件反序列化漏洞原理得知需要__type这个Key的值,要得到这个Value就必须得到程序集全标识(包括程序集名称、版本、语言文化和公钥),那么在JavaScriptSerializer中可以通过实例化SimpleTypeResolver类,作用是为托管类型提供类型解析器,可在序列化字符串中自定义类型的元数据程序集限定名称。笔者将代码改写添加类型解析器

这次序列化输出程序集的完整标识,如下

三、JavaScriptSerializer反序列化

3.1 反序列化用法

反序列化过程就是将Json数据转换为对象,在JavaScriptSerializer类中创建对象然后调用DeserializeObject或Deserialize方法实现的。

在BasicDeserialize内部又调用了DeserializeInternal方法,当需要转换为对象的时候会判断字典集合中是否包含了ServerTypeFieldName常量的Key,

ServerTypeFieldName常量在JavaScriptSerializer类中定义的值为"__type",

剥茧抽丝,忽略掉非核心方法块ConvertObjectToType、ConvertObjectToTypeMain 、ConvertObjectToTypeInternal,最后定位到ConvertDictionaryToObject方法内

这段代码首先判断ServerTypeFieldName存在值的话就输出赋值给对象s,第二步将对象s强制转换为字符串变量serverTypeName,第三部获取解析器中的实际类型,并且通过System.Activator的CreateInstance构造类型的实例

Activator类提供了静态CreateInstance方法的几个重载版本,调用方法的时候既可以传递一个Type对象引用,也可以传递标识了类型的String,方法返回对新对象的引用。下图Demo展示了序列化和反序列化前后的效果:

反序列化后得到对象的属性,打印输出当前的成员Name的值

3.2 打造Poc

默认情况下JavaScriptSerializer不会使用类型解析器,所以它是一个安全的序列化处理类,漏洞的触发点也是在于初始化JavaScriptSerializer类的实例的时候是否创建了SimpleTypeResolver类,如果创建了,并且反序列化的Json数据在可控的情况下就可以触发反序列化漏洞,借图来说明调用链过程

笔者还是选择ObjectDataProvider类方便调用任意被引用类中的方法,具体有关此类的用法可以看一下《.NET高级代码审计(第一课) XmlSerializer反序列化漏洞》,因为Process.Start方法启动一个线程需要配置ProcessStartInfo类相关的属性,例如指定文件名、指定启动参数,所以首先得考虑序列化ProcessStartInfo,这块可参考《.NET高级代码审计(第三课) Fastjson反序列化漏洞》 ,之后对生成的数据做减法,去掉无关的System.RuntimeType、System.IntPtr数据,最终得到反序列化Poc

笔者编写了触发代码,用Deserialize反序列化Json成功弹出计算器

四、代码审计视角

4.1 Deserialize

从代码审计的角度其实很容易找到漏洞的污染点,通过前面几个小节的知识能发现需要满足一个关键条件new SimpleTypeResolver() ,再传入Json数据,就可被反序列化,例如下面的JsonHelper类

攻击者只需要控制传入字符串参数input便可轻松实现反序列化漏洞攻击。Github上也存在大量的不安全案例代码

4.2 DeserializeObject

JavaScriptSerializer还有一个反序列化方法DeserializeObject,这个方法同样可以触发漏洞,具体污染代码如下

五、案例复盘

最后再通过下面案例来复盘整个过程,全程展示在VS里调试里通过反序列化漏洞弹出计算器。

1. 输入http://localhost:5651/Default Post加载value值

2. 通过DeserializeObject 反序列化 ,并弹出计算器

最后附个动态图:

六、总结

JavaScriptSerializer凭借微软自身提供的优势,在实际开发中使用率还是比较高的,只要没有使用类型解析器或者将类型解析器配置为白名单中的有效类型就可以防止反序列化攻击(默认就是安全的序列化器),对于攻击者来说实际场景下估计利用概率不算高,毕竟很多开发者不会使用SimpleTypeResolver类去处理数据。

看完上述内容,你们掌握JavaScript Serializer反序列化漏洞是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

序列 方法 漏洞 代码 类型 对象 数据 审计 高级 笔者 攻击 安全 实例 时候 程序 处理 开发 字符 字符串 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 奇酷互联网科技公司 互联网科技美容 互联网巨头投资的硬核科技 互联网公司会议桌创意科技软装饰 互联网科技公司招聘 博兴的互联网电子科技公司 中国科技互联网公司收入 中国的互联网科技企业的崛起 江阴互联网智能科技产品进口 群盈汇互联网科技有限公司 互联网金融科技公司的优势 深圳互联网科技的发展 互联网科技实习生岗位 富国互联网金融科技混合基金 陕西云淼互联网科技公司 郑州欣桑互联网科技有限公司 西安左小互联网科技有限公司 10位科技互联网大佬 互联网大会出现的黑科技 互联网最新的科技 互联网科技logo设计 北京华百购互联网科技有限公司 南山科技园互联网公司有哪些 宁夏科技产业互联网案例 未来五年的互联网科技 无锡工业互联网科技有限公司 玉溪新华互联网科技怎么选 重庆科技产业互联网有哪些 小牛互联网科技有限公司地址
0