首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Newtonsoft Json中的TypeNameHandling警告

Newtonsoft Json中的TypeNameHandling警告
EN

Stack Overflow用户
提问于 2016-09-19 05:29:08
回答 2查看 20.2K关注 0票数 28

链接中,备注部分提到:

当应用程序从外部源反序列化JSON时,应该谨慎地使用TypeNameHandling。当使用SerializationBinder以外的值反序列化时,应使用自定义TypeNameHandling.None验证传入类型。

在什么情况下,如果用TypeNameHandling.All序列化/反序列化,来自外部源的JSON将是有害的?请举例说明。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-21 10:54:20

当使用TypeNameHandling.All反序列化时,在没有SerializationBinder检查的情况下,json.net将尝试在JSON中创建作为元数据的类型实例。

代码语言:javascript
运行
复制
public class Car
{
    public string Maker { get; set; }
    public string Model { get; set; }
}

{
   "$type": "Car",
   "Maker": "Ford",
   "Model": "Explorer"
} //create a Car and set property values

但是,攻击者可能会将代码或框架中存在的危险类型发送给您。

也就是说,这里 System.CodeDom.Compiler.TempFileCollection是一个可序列化的类,它的目的是维护编译过程中产生的临时文件列表,并在不再需要时删除它们。为了确保文件被删除,类实现了在垃圾收集器清除对象时调用的终结器。攻击者将能够构造这个类的序列化版本,它将其内部文件集合指向受害者系统上的任何文件。这将在反序列化之后的某个时候被删除,而不需要从反序列化应用程序中进行任何交互。

代码语言:javascript
运行
复制
    [Serializable]
    public class TempFileCollection
    {
       private Hashtable files;
       // Other stuff...

       ~TempFileCollection()
       {
         if (KeepFiles) {return}
         foreach (string file in files.Keys)
         {
            File.Delete(file);
         }
       }
    }

   {
       "$type": "System.CodeDom.Compiler.TempFileCollection",
       "BasePath": "%SYSTEMDRIVE",
       "KeepFiles": "False",
       "TempDir": "%SYSTEMROOT%"
    } // or something like this, I just guessing but you got the idea
票数 41
EN

Stack Overflow用户

发布于 2018-03-01 01:16:28

在Alvaro Mu oz& Oleksandr Mirosh的黑帽纸https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf中发现了一些额外的攻击小工具。它们是:

  • System.Configuration.Install.AssemblyInstaller -攻击向量:在程序集负载上执行有效负载。
  • System.Activities.Presentation.WorkflowDesigner -攻击向量:在解析Xaml有效载荷时执行静态方法。
  • System.Windows.ResourceDictionary -攻击矢量:攻击者向受控服务器发送带有URL的有效载荷,此服务器使用Xaml有效载荷和ContentType = application/xaml+xml进行响应,目标服务器将在解析Xaml有效负载期间执行所需的静态方法。
  • System.Windows.Data.ObjectDataProvider攻击向量: 1)调用任何解封对象的方法;2)可以用受控参数调用所需类型的参数化构造函数;3)调用任何公共方法,包括具有受控参数的静态方法。
  • System.Windows.Forms.BindingSource -攻击向量:任意的getter调用。
  • Microsoft.Exchange.Management.SystemManager.WinForms.ExchangeSettingsProvider -攻击向量:它允许从设置器跳到嵌套BinaryFormatter反序列化。

但是,请注意,攻击小工具类型必须与正在反序列化的预期类型兼容(可分配到),才能使攻击成功。当预期的类型是objectdynamic时,这种情况总是正确的,在其他情况下也可能是这样。详情请参见https://stackoverflow.com/q/49038055/3744182

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39565954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档