在这个链接中,在备注部分提到:
当应用程序从外部源反序列化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反序列化。
object
或dynamic
时,这总是正确的,在其他情况下也可能是正确的。参见外部json易受json攻击。Net TypeNameHandling auto?