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:// SharePointDomin Or IP>:/_layouts/15/Picker.aspx?PickerDialogType=,通過修改WebForm PostBack后攜帶參數ctl00%24PlaceHolderDialogBodySection%24ctl05%24hiddenSpanData的值來加載Payload。使用反編譯工具ILSpy加載SharePoint.dll搜索入口ItemPickerDialog,通過分析它的構造函數,發現其調用了父類的構造函數,傳參如下:



進入父類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