由于 Json.Net TypeNameHandling auto,外部 json 易受攻击? [英] External json vulnerable because of Json.Net TypeNameHandling auto?

查看:13
本文介绍了由于 Json.Net TypeNameHandling auto,外部 json 易受攻击?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在运营一个小型网站,用户可以在其中上传以 JSON 定义的自定义对象".最近我了解到使用带有自动类型反序列化的 JSON 可能存在的威胁:JSON 问题.我想我理解这些问题,但我必须要确定.如果我只用给定的特定类型(此处为 MyObject)JsonConvert.DeserializeObject(json, settings); 反序列化传入的 JSON,并且 MyObject 内没有类型 并且 MyObject 的任何成员的子类型都没有类型 System.Objectdynamic 没有什么会变坏,对吧?

settings

TypeNameHandling 设置为 TypeNameHandling.Auto(我们不要质疑这个决定,它可能适用于 None,但我想理解设置为 Auto 的问题.)

更多信息:我已经从前面提到的网站测试了 JSON:

<代码>{对象":{"$type": "System.IO.FileInfo, System.IO.FileSystem","fileName": "rce-test.txt",IsReadOnly":真}}

如果 MyObjectSystem.Objectdynamic 类型字段 obj 我可以重现威胁.但我想知道的是:即使 MyObject 是一个非常复杂的对象,它有很多(派生的)子对象,但没有一个是或有一个 System.Object 或动态字段(也不像 List<Object>)?例如.我可以想象 Json.NET 会因为 $type 信息而执行类似创建对象的操作,即使在 MyObject 中找不到相应的字段.

解决方案

TL/DR:在没有任何明显的objectdynamic 成员们,您可能是安全的,但您并不能保证是安全的.为了进一步降低您的风险,您应该遵循 Newtonsoft 文档中的建议:

<块引用>当您的应用程序反序列化 JSON 来自一个外部来源.当反序列化值为 other比无.

完整答案

如何配置 Json.NET 以创建易受攻击的 Web APINewtonsoft Json 中的 TypeNameHandling 谨慎 和 Alvaro Muñoz &Oleksandr Mirosh 的 blackhat 论文都依赖于使用 TypeNameHandling Json.NET 的设置 以欺骗接收者构造攻击小工具 - 一种类型的实例,在构造、填充或处置时会影响对接收系统的攻击.

Json.NET 做了两件事来帮助防止此类攻击.首先,它忽略了未知属性.因此,简单地向 JSON 有效负载添加一个额外的未知属性,其值包含 "$type" 属性应该没有害处.其次,在多态值的反序列化过程中,当解析 "$type" 属性时,它会检查解析的类型是否与 JsonSerializerInternalReader.ResolveTypeName():

<块引用>

 if (objectType != null#if HAVE_DYNAMIC&&objectType != typeof(IDynamicMetaObjectProvider)#万一&&!objectType.IsAssignableFrom(specifiedType)){throw JsonSerializationException.Create(reader, "JSON '{0}' 中指定的类型与'{1}' 不兼容.".FormatWith(CultureInfo.InvariantCulture, specifiedType.AssemblyQualifiedName, objectType.AssemblyQualifiedName));}

如果多态值的预期类型与任何攻击小工具类型不兼容,则攻击将失败.如果您没有 objectdynamicIDynamicMetaObjectProvider 类型的可序列化成员,这很可能是真的.但不确定!

即使您的数据模型中没有任何明显的无类型成员,也可能构建攻击小工具的情况包括: