CVE-2019-0604:微软SHAREPOINT远程执行的脆弱性分析
字数 1966 2025-08-29 08:32:02

Microsoft SharePoint 远程代码执行漏洞(CVE-2019-0604)技术分析与利用教学

漏洞概述

CVE-2019-0604是Microsoft SharePoint中的一个严重远程代码执行(RCE)漏洞,允许攻击者在SharePoint应用和服务器账户中执行任意代码。该漏洞由Markus Wulftange发现并报告给ZDI计划。

漏洞原理

核心问题

漏洞的核心在于XmlSerializer(Type)构造函数的不安全使用。虽然XmlSerializer通常被认为是安全的序列化程序,但当攻击者能够控制预期的类型数据时,就可能被利用进行反序列化攻击。

漏洞位置

主要存在于以下两个程序集中的方法:

  • Microsoft.SharePoint.dll中的Microsoft.SharePoint.BusinessData.Infrastructure.EntityInstanceIdEncoder.DecodeEntityInstanceId(string)
  • Microsoft.SharePoint.Portal.dll中的Microsoft.Office.Server.ApplicationRegistry.Infrastructure命名空间中的相同功能类型

技术分析

数据流分析

  1. 起点分析

    • 漏洞起点在EntityInstanceIdEncoder.DecodeEntityInstanceId(string)方法
    • 该方法接收一个encodedId参数,用于指定期望类型(typeName)和反序列化数据
  2. 调用链分析

    ItemPicker.ValidateEntity(PickerEntity)
      → EntityEditor.Validate()
        → EntityEditor.LoadPostData(string, NameValueCollection)
          → System.Web.UI.IPostBackDataHandler.LoadPostData(string, NameValueCollection)
    
  3. 关键控制点

    • EntityEditor.Entities属性由私有字段m_listOrder决定
    • m_listOrderm_listOrderTemp获取值
    • m_listOrderTemp的值来自EntityEditor.ParseSpanData方法
    • ParseSpanData处理名为"hiddenSpanData"的HtmlInputHidden字段值

攻击面

攻击可通过以下页面实现:

  • /_layouts/15/Picker.aspx
  • 需要设置"PickerDialogType" URL参数为以下类型之一:
    • Microsoft.SharePoint.WebControls.ItemPickerDialog (在Microsoft.SharePoint.dll中)
    • Microsoft.SharePoint.Portal.WebControls.ItemPickerDialog (在Microsoft.SharePoint.Portal.dll中)

漏洞利用

利用条件

  1. 能够访问SharePoint服务器
  2. 能够向/_layouts/15/Picker.aspx发送POST请求
  3. 能够控制hiddenSpanData字段的值

利用步骤

  1. 定位攻击点

    • 访问/_layouts/15/Picker.aspx页面
    • 设置"PickerDialogType"参数为ItemPickerDialog类型
  2. 构造恶意请求

    • 构造POST请求,包含恶意构造的ctl00$PlaceHolderDialogBodySection$ctl05$hiddenSpanData字段
    • 该字段值应以特定结构开头(如"dummy")
  3. 触发漏洞

    • 提交表单,触发反序列化过程
    • 恶意payload将被EntityInstanceIdEncoder.DecodeEntityInstanceId处理

调试验证

使用dnSpy调试工具:

  1. 附加到IIS工作进程(w3wp.exe)
  2. EntityInstanceIdEncoder.DecodeEntityInstanceId设置断点
  3. 观察调用栈和数据流

防御措施

  1. 官方补丁

    • 及时安装Microsoft发布的补丁
  2. 临时缓解措施

    • 限制对/_layouts/15/Picker.aspx的访问
    • 监控异常的反序列化请求
  3. 开发实践

    • 避免使用用户可控数据作为XmlSerializer的类型参数
    • 实施严格的数据验证

工具与资源

  1. 分析工具

    • dnSpy:用于.NET应用程序的反编译和调试
  2. 参考资源

    • ZDI漏洞报告
    • Alvaro Muñoz和Oleksandr Mirosh的JSON攻击研究

总结

CVE-2019-0604展示了即使是被认为安全的API(如XmlSerializer)在不正确使用时也会带来严重风险。该漏洞的关键在于攻击者能够控制反序列化的类型参数,从而执行任意代码。理解这类漏洞的数据流和控制流对于开发安全的应用程序至关重要。

Microsoft SharePoint 远程代码执行漏洞(CVE-2019-0604)技术分析与利用教学 漏洞概述 CVE-2019-0604是Microsoft SharePoint中的一个严重远程代码执行(RCE)漏洞,允许攻击者在SharePoint应用和服务器账户中执行任意代码。该漏洞由Markus Wulftange发现并报告给ZDI计划。 漏洞原理 核心问题 漏洞的核心在于 XmlSerializer(Type) 构造函数的不安全使用。虽然 XmlSerializer 通常被认为是安全的序列化程序,但当攻击者能够控制预期的类型数据时,就可能被利用进行反序列化攻击。 漏洞位置 主要存在于以下两个程序集中的方法: Microsoft.SharePoint.dll 中的 Microsoft.SharePoint.BusinessData.Infrastructure.EntityInstanceIdEncoder.DecodeEntityInstanceId(string) Microsoft.SharePoint.Portal.dll 中的 Microsoft.Office.Server.ApplicationRegistry.Infrastructure 命名空间中的相同功能类型 技术分析 数据流分析 起点分析 : 漏洞起点在 EntityInstanceIdEncoder.DecodeEntityInstanceId(string) 方法 该方法接收一个 encodedId 参数,用于指定期望类型(typeName)和反序列化数据 调用链分析 : 关键控制点 : EntityEditor.Entities 属性由私有字段 m_listOrder 决定 m_listOrder 从 m_listOrderTemp 获取值 m_listOrderTemp 的值来自 EntityEditor.ParseSpanData 方法 ParseSpanData 处理名为"hiddenSpanData"的 HtmlInputHidden 字段值 攻击面 攻击可通过以下页面实现: /_layouts/15/Picker.aspx 需要设置"PickerDialogType" URL参数为以下类型之一: Microsoft.SharePoint.WebControls.ItemPickerDialog (在Microsoft.SharePoint.dll中) Microsoft.SharePoint.Portal.WebControls.ItemPickerDialog (在Microsoft.SharePoint.Portal.dll中) 漏洞利用 利用条件 能够访问SharePoint服务器 能够向 /_layouts/15/Picker.aspx 发送POST请求 能够控制 hiddenSpanData 字段的值 利用步骤 定位攻击点 : 访问 /_layouts/15/Picker.aspx 页面 设置"PickerDialogType"参数为ItemPickerDialog类型 构造恶意请求 : 构造POST请求,包含恶意构造的 ctl00$PlaceHolderDialogBodySection$ctl05$hiddenSpanData 字段 该字段值应以特定结构开头(如"dummy") 触发漏洞 : 提交表单,触发反序列化过程 恶意payload将被 EntityInstanceIdEncoder.DecodeEntityInstanceId 处理 调试验证 使用dnSpy调试工具: 附加到IIS工作进程(w3wp.exe) 在 EntityInstanceIdEncoder.DecodeEntityInstanceId 设置断点 观察调用栈和数据流 防御措施 官方补丁 : 及时安装Microsoft发布的补丁 临时缓解措施 : 限制对 /_layouts/15/Picker.aspx 的访问 监控异常的反序列化请求 开发实践 : 避免使用用户可控数据作为 XmlSerializer 的类型参数 实施严格的数据验证 工具与资源 分析工具 : dnSpy:用于.NET应用程序的反编译和调试 参考资源 : ZDI漏洞报告 Alvaro Muñoz和Oleksandr Mirosh的JSON攻击研究 总结 CVE-2019-0604展示了即使是被认为安全的API(如 XmlSerializer )在不正确使用时也会带来严重风险。该漏洞的关键在于攻击者能够控制反序列化的类型参数,从而执行任意代码。理解这类漏洞的数据流和控制流对于开发安全的应用程序至关重要。