Newtonsoft Json中的TypeNameHandling警告

pre*_*eja 20 c# serialization json.net

这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.

jlv*_*ero 31

使用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
Run Code Online (Sandbox Code Playgroud)

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

即from 这里 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
Run Code Online (Sandbox Code Playgroud)

  • 更多请参见【如何配置 Json.NET 以创建易受攻击的 Web API】(https://www.alphabot.com/security/blog/2017/net/How-to-configure-Json.NET-to-create -a-vulnerable-web-API.html)。 (2认同)
  • 还有AlvaroMuñoz和Oleksandr Mirosh的黑帽论文https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf (2认同)

dbc*_*dbc 8

Alvaro Mu\xc3\xb1oz 和 Oleksandr Mirosh 的黑帽论文中还发现了一些其他攻击工具https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-第 13-JSON-攻击-wp.pdf。这些都是:

\n\n
    \n
  • System.Configuration.Install.AssemblyInstaller- 攻击向量:在程序集加载上执行有效负载。

  • \n
  • System.Activities.Presentation.WorkflowDesigner- 攻击向量:在解析 Xaml 有效负载期间执行静态方法。

  • \n
  • System.Windows.ResourceDictionary- 攻击向量:攻击者将带有 URL 的有效负载发送到受控服务器,该服务器以 Xaml 有效负载进行响应,并且ContentType = application/xaml+xml目标服务器将在解析 Xaml 有效负载期间执行所需的静态方法。

  • \n
  • System.Windows.Data.ObjectDataProvider- 攻击向量:1)调用未编组对象的任何方法;2)我们可以使用受控参数调用所需类型的参数化构造函数;3) 调用任何公共方法,包括具有受控参数的静态方法。

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

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

  • \n
\n\n

但请注意,攻击小工具类型必须与反序列化的预期类型兼容(可分配给),攻击才能成功。当预期类型为objector时,这始终为真dynamic,并且在其他情况下可能为真。请参阅由于 Json.Net TypeNameHandling auto 导致外部 json 易受攻击?了解详情。

\n