导语:安全研究团队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 2019 | cpe:2.3:a:microsoft:sharepoint_server:2019:kb5002874 | KB5002874 |
| Microsoft SharePoint Enterprise Server 2016 | cpe:2.3:a:microsoft:sharepoint_server:2016:kb5002880 | KB5002880 |
| Microsoft SharePoint Server Subscription Edition | cpe:2.3:a:microsoft:sharepoint_server:subscription_edition:kb5002873 | KB5002873 |
测试环境(受影响版本)
| 组件 | 详情 |
|---|---|
| 产品 | SharePoint Server 2019(Windows Server 2025 Standard 24H2) |
| 构建版本 | 16.0.10417.20128 |
| 二进制文件 | microsoft.office.policy.pages.dll |
| 文件版本 | 16.0.10337.12109 |
| 大小 | 547,096字节 |
| SHA256 | E7ECA49AB6485D0F4281420FD680A7DAD9418B86086773C47BB445A3BFF51CBA |
四、漏洞根因分析
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攻击链
- 攻击者对”Documents”库有Contribute权限
- GET Upload.aspx?List={Documents_GUID}&RootFolder=/_catalogs/masterpage
- POST webshell.aspx到相同URL(遍历上传)
- 文件落入/_catalogs/masterpage/webshell.aspx
- GET /_catalogs/masterpage/webshell.aspx?cmd=whoami
- SharePoint编译ASPX → 服务器端代码执行
- 输出:应用程序池身份
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响应 | 200 | 200(错误页面) |
| 目标库中的文件 | 是(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月。
版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。











暂无评论内容