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