【问题标题】:TypeNameHandling caution in Newtonsoft JsonNewtonsoft Json 中的 TypeNameHandling 谨慎
【发布时间】:2017-01-26 17:12:53
【问题描述】:

this 链接上,在备注部分提到:

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

在什么情况下,如果使用TypeNameHandling.All 序列化/反序列化来自外部源的 JSON 会有害?一个工作示例将不胜感激。

【问题讨论】:

标签: c# serialization json.net


【解决方案1】:

在 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 时,这始终是正确的,在其他情况下可能是正确的。详情请见External json vulnerable because of Json.Net TypeNameHandling auto?

【讨论】:

    【解决方案2】:

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

    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
    

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

    即来自here System.CodeDom.Compiler.TempFileCollection 是一个可序列化的类,其目的是维护一个由编译过程产生的临时文件列表,并在不再需要它们时删除它们。为了确保文件被删除,该类实现了一个终结器,当垃圾收集器清理对象时将调用该终结器。攻击者将能够构建此类的序列化版本,将其内部文件集合指向受害者系统上的任何文件。这将在反序列化后的某个时间点被删除,而无需反序列化应用程序的任何交互。

        [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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多