typename Newtonsoft Json中的处理警告



在这个链接中,在备注部分提到:

当应用程序从外部源反序列化JSON时,应该谨慎使用

TypeNameHandling。当使用TypeNameHandling.None以外的值反序列化时,应该使用自定义SerializationBinder来验证传入类型。

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

当使用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

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

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

在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)我们可以调用具有控制参数的期望类型的参数化构造函数;

  • System.Windows.Forms.BindingSource -攻击向量:任意getter调用

  • Microsoft.Exchange.Management.SystemManager.WinForms.ExchangeSettingsProvider -攻击向量:它允许从setter跳转到嵌套的BinaryFormatter反序列化。

但是请注意,攻击小部件类型必须与被反序列化的预期类型兼容(可分配给),这样攻击才能成功。当期望的类型是objectdynamic时,这总是正确的,在其他情况下也可能是正确的。参见外部json易受json攻击。Net TypeNameHandling auto?

相关内容

  • 没有找到相关文章

最新更新