其他分享
首页 > 其他分享> > .NET高级代码审计(第14课)反序列化Gadget之详解XAML

.NET高级代码审计(第14课)反序列化Gadget之详解XAML

作者:互联网

0X01 XAML入门

WPF是用于替代Windows Form来创建Windows客户端的应用程序,和Web项目一样遵从前端布局和后端代码实现分离的原则,Web项目前端通常是HTML,而XAML是用作WPF项目前端界面开发,XAML的全称是 Extensible Application Markup Language,基于通用XML语法用于实例化 .NET对象的标记语言。基本情况如下图

XAML 文档中的每个元素都映射为.NET类的一个实例,如根元素<Window>表示WPF创建Window对象,另外根元素还有<Application>、<Page>、<UserControl>,事实上XAML在编译时也会编成C#类,所以界面对应的.cs文件内的后台代码内要声明 partial 关键字,从而达到在编译的时候UI界面和运行逻辑代码合在一起的状态。如下最基本的XAML代码

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
    </Grid>
</Window>

上述仅包含Window元素以及Grid元素,Window元素代表整个窗口,Grid 可以放置所有的控件。总体结构其实是一个窗体对象内嵌套一个Grid对象。x:Class 代表后端的命名空间和类名,这样的好处在于将WPF里的前端XAML和后端实现代码分开维护,xmlns全拼是:XML namespace,即XML命令空间,xmlns后面可以跟一个可选映射前缀 x,两者之间用冒号分割,另外还声明了两个 xmlns 名称空间,如下表

名称 说明
http://schemas.microsoft.com/winfx/2006/xaml/presentation WPF核心名称空间,包含了所有WPF类,包括用来构建用户界面的控件
http://schemas.microsoft.com/winfx/2006/xaml XAML名称空间,该名称空间被映射为前缀 xmlns:x,可通过前缀x来使用该名称空间,如<x:ElementName>
  上面列表的网址分别是什么意思呢?这里是XAML解析器的硬性约定,http://schemas.microsoft.com/winfx/2006/xaml/presentation 表示引入WPF核心程序集 PresentationFramework,例如常见的 System.Windows.Data 命名空间,http://schemas.microsoft.com/winfx/2006/xaml  表示引入另外核心程序集 System.Xaml,例如常用的 Windows.Markup, 反编译后可见 如图    
<Window x:Class="WpfApplication1.MainWindow"
        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"
        Title="MainWindow" Height="300" Width="300">
    <ListBox>
        <ListBoxItem>
            <sys:String>this is demo</sys:String>
        </ListBoxItem>
    </ListBox>
</Window>

xmlns:sys="clr-namespace:System;assembly=mscorlib" 表示将 sys 前缀 映射到.NET基类库System名称空间,后续用<sys:String>获取字符串类型,类似若想引入其他.NET程序集支持的基类,参考如下语法 xmlns:Prefix="clr-namespace:Namespace;assembly=AssemblyName"

名称 说明
Prefix XAML标记中用于指示名称空间的XML前缀
Namespace 完全限定.NET命名空间的名称
AssemblyName 声明类型的程序集

例如反序列化攻击载荷常用的Diagnostics.Process类所在的程序集: xmlns:c="clr-namespace:System.Diagnostics;assembly=system" 

0X02 x:名称指令

笔者创建的项目名ObjectDataProvider有一定迷惑性,这里说明下和反序列化用到的ObjectDataProvider类毫无关联

标签:strXMAL,xmlns,14,XAML,XamlReader,System,Parse,序列化
来源: https://www.cnblogs.com/Ivan1ee/p/16162648.html