在json反序列化攻击中观看此视频,它显示了这一点json,可用于在任何反序列化它的应用程序上触发任意代码执行.
现在在我的应用程序中,我甚至从未使用过类型的json.我总是反序列化为动态对象或JObjects.在$type今天早上另一次无关的谈话之前,我甚至都不知道这个房产.
在我的json设置中是否有一种方法可以告诉它永远不会写或读取此属性?这不是我想要的东西.
"$type"信息仅在TypeNameHandling被修改为非默认值时写入TypeNameHandling.None- 这是默认值.如果您从未更改过该值, "$type"则不会发出信息.
类似的"$type"属性在反序列化时会被忽略TypeNameHandling = TypeNameHandling.None(这也是默认值),如文档中所述:
// for security TypeNameHandling is required when deserializing
Stockholder newStockholder =
JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
Run Code Online (Sandbox Code Playgroud)
如果您的代码(或代码使用的类库)中的任何内容都没有修改TypeNameHandling为TypeNameHandling.None(通过设置或属性等JsonPropertyAttribute.TypeNameHandling)以外的其他内容,那么代码执行攻击就无法工作.(有关Json.NET的序列化程序的使用的更准确的细节,这些序列化程序不易受此攻击,请参阅AlvaroMuñoz和Oleksandr Mirosh的黑帽纸.
另请注意,如果使用JToken.Parse()(或某些类似的静态方法JObject.Parse())进行解析而不是反序列化,JsonSerializer.Deserialize<T>()则"$type"属性的存在将导致此类属性填充到JToken层次结构中,因为JToken.Parse()从不调用序列化程序.如果仍然想要去除那些"$type"解析后的属性,你可以使用JsonExtensions.RemoveTypeMetadata(this JToken root)从该用TypeNameHandling.All序列化反序列化的字符串来做到这一点.
如此说来,如果一个集合是由另一个应用程序中使用序列化TypeNameHandling.Arrays或TypeNameHandling.All然后会出现在JSON嵌套了一层额外的.要在反序列化时去除它,请参阅IgnoreCollectionTypeConverter从版本/格式之间迁移序列化Json.NET文档的策略,或者IgnoreArrayTypeConverter从Make Json.NET中查看如果它不兼容则忽略$ type.
最后,如果您正在使用设置TypeNameHandling属性的第三方库,则可以使用自定义合约解析程序禁用它,如在Json.NET中使用JsonSerializerSettings在属性中指定的如何禁用TypeNameHandling中所示?.
如果您真的担心团队中的其他人可能会启用TypeNameHandling,那么ISerializationBinder只要尝试解析类型或类型名称,您就可以创建一个抛出异常的自定义:
public class DisallowSerializationBindingBinder : ISerializationBinder
{
#region ISerializationBinder Members
public void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
throw new JsonSerializationException("Binding of subtypes has been disabled");
}
public Type BindToType(string assemblyName, string typeName)
{
throw new JsonSerializationException("Binding of subtypes has been disabled");
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
然后JsonSerializerSettings按如下方式设置:
var settings = new JsonSerializerSettings
{
SerializationBinder = new DisallowSerializationBindingBinder(),
};
Run Code Online (Sandbox Code Playgroud)
并修改全局设置,如设置默认全局json序列化程序设置(对于控制台应用程序),如何在MVC 4 Web API中为Json.NET设置自定义JsonSerializerSettings?(对于ASP.NET Web API)或JsonSerializerSettings和Asp.Net Core(对于asp.net核心).
| 归档时间: |
|
| 查看次数: |
1742 次 |
| 最近记录: |