SharePoint 远程代码执行误差清静通告
宣布时间 2019-03-29误差编号和级别
CVE编号:CVE-2019-0604,危险级别:高危, CVSS分值:7.8
影响版本:
Microsoft SharePoint Server 2019
Microsoft SharePoint Enterprise Server 2016
Microsoft SharePoint Foundation 2013 Service Pack 1
Microsoft SharePoint Server 2010 Service Pack 2
误差概述
SharePoint是微软的一款团队协作解决计划,用于团队间共享和管理内容和知识。它使用ASP.NET开发,后端数据库使用Microsoft SQL Server。
乐成使用误差,可导致Windows系统服务器远程执行下令,有可能完全控制服务器。
攻击者可将全心结构的请求通过ItemPicker WebForm控件传入后端EntityInstanceIdEncoder.DecodeEntityInstanceId(encodedId)要领中,由于要领没有对传入的encodedId举行任那里置,也没有对XmlSerializer结构函数的类型参数举行限制,可直接通过XmlSerializer反序列化,造成下令执行。
要使用该误差,需要授权会见SharePoint提供的管理网页,授权账户可以是一个域账户。
误差细节
使用条件:
可授权会见SharePoint提供的管理网页,授权账户可以是一个域账户。
情形搭建:
? Windows server 2016
? ASP.NET相关组件
? Microsoft SQL Server
? SharePoint Server
装置SharePoint前可以先运行prerequisiteinstaller 装置SharePoint必备的组件,然后装置Microsoft SQL Server,设置好账户。若是在单机上搭建SharePoint需要在此时将服务器切换为域控服务器,然后再建设域账号装置和安排SharePoint。外地账号不切合SharePoint的安排要求。
误差剖析:
误差入口在http://
进入父类PickerDialog中,看结构函数:
其中EntityEditorWithPicker也是一个WebForm控件,说明在这里传入了一个EntityEditorWithPicker的子类ItemPicker,跟入ItemPicker可看到ItemPicker确实继续自EntityEditorWithPicker,EntityEditorWithPicker又继续自EntityEditor:
EntityEditor实现了接口:IPostBackDataHandler和ICallbackEventHandler,凭证WebForm控件的生命周期,在页面中有事务触发__doPostBack()后,先挪用通过ICallbackEventHandler实现的RaiseCallbackEvent()要领和GetCallbackResult()要领获得表单内容,再挪用通过IPostBackDataHandler实现的LoadPostData()要领。
回到EntityEditor中看GetCallbackResult()要领中挪用了InvokeCallbackEvent()要领,InvokeCallbackEvent()要领挪用了ParseSpanData()要领:
来到ParseSpanData()中可以看出这里把表单提交的数据举行了处置惩罚。此处逻辑很是重大,我们只跟对HiddenSpanData的处置惩罚:
可发明此要领将HiddenSpanData的值放入了PickerEntity的List中,在经由一些处置惩罚后支解成数组,遍历数组,新建PickerEntity工具pickerEntity2,将其值放入pickerEntity2.Key中,最终放入arrayList中并赋值给类成员变量m_listOrderTemp:
回到LoadPostData()要领看对m_listOrderTemp成员变量的处置惩罚,可看到在这里遍历了m_listOrderTemp成员变量的值并将其加进m_listRevalidation成员变量中,然后迭代举行Validate()操作:
在Validate()要领中,将m_listOrderTemp成员变量赋值给m_listOrder成员变量:
然后遍历Entities的值挪用ValidateEntity()要领:
Entities的值来自于上面的一行很不起眼的Lambda表达式要领,此要领将返回m_listOrder成员变量的值:
跟到ValidateEntity()要领发明是虚要领,因此去子类找要领的重写。
来到EntityEditorWithPicker类中看到了ValidateEntity() 要领的重写,发明其将PickerEntity的key(pe.Key)传入了Microsoft.SharePoint.BusinessData.Infrastructure.EntityInstanceIdEncoder.DecodeEntityInstanceId()中。
进入DecodeEntityInstanceId() 要领发明反序列化,并且XmlSerializer结构函数的类型参数可控。
补丁剖析:
装置补丁KB4462211后再次反编译,比照DecodeEntityInstanceId()要领的源码,发明已经不再支持工具类型的反序列化。
误差使用
在误差剖析时,我们在EntityInstanceIdEncoder类中看到另一个要领EncodeEntityInstanceId(),可以直接使用它天生Payload。
结构XML:
天生Payload:
天生Payload时会弹出一次盘算器,关掉即可。
PoC:
修复建议
现在官方已推出响应补丁,请尽快升级举行修复。
Microsoft SharePoint Enterprise Server 2016
Security Update for Microsoft SharePoint Enterprise Server 2016(KB4462211)
https://www.microsoft.com/en-us/download/details.aspx?id=58072
Microsoft SharePoint Foundation 2013 Service Pack 1
Security Update for Microsoft SharePoint Enterprise Server 2013(KB4462202)
https://www.microsoft.com/en-us/download/details.aspx?id=58063
Microsoft SharePoint Server 2010 Service Pack 2
Security Update for 2010 Microsoft Business Productivity Servers(KB4462184)
https://www.microsoft.com/en-us/download/details.aspx?id=58066
Microsoft SharePoint Server 2019
Security Update for Microsoft SharePoint Server 2019 Core(KB4462199)
https://www.microsoft.com/en-us/download/details.aspx?id=58061
参考链接
https://www.thezdi.com/blog/2019/3/13/cve-2019-0604-details-of-a-microsoft-sharepoint-rce-vulnerability
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0604


京公网安备11010802024551号