Confluence路径穿越漏洞复现(CVE-2019-3398 )
字数 1531 2025-08-26 22:11:35

Confluence路径穿越漏洞复现与分析(CVE-2019-3398)

漏洞概述

漏洞名称:Confluence Server和Data Center路径穿越漏洞
CVE编号:CVE-2019-3398
漏洞类型:路径穿越导致任意文件写入
影响组件:downloadallattachments资源
危险等级:高危(可导致任意代码执行)

受影响版本

  • 2.0.0 ≤ version < 6.6.13
  • 6.7.0 ≤ version < 6.12.4
  • 6.13.0 ≤ version < 6.13.4
  • 6.14.0 ≤ version < 6.14.3
  • 6.15.0 ≤ version < 6.15.2

安全版本

  • 6.6.13
  • 6.12.4
  • 6.13.4
  • 6.14.3
  • 6.15.2

漏洞描述

Confluence Server和Data Center在downloadallattachments资源中存在路径穿越漏洞。具有以下权限之一的用户可利用此漏洞:

  1. 在Page或Blogs具有添加附件权限的用户
  2. 具有创建新空间或个人空间权限的用户
  3. 对某空间具有"管理员"权限的用户

攻击者可利用此漏洞将文件写入任意位置,特定条件下可执行任意代码。

环境搭建

  1. 下载受影响版本(如6.13.0):
wget https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-6.13.0.tar.gz
tar zxf atlassian-confluence-6.13.0.tar.gz
cd atlassian-confluence-6.13.0
  1. 配置Confluence:
vi ./confluence/WEB-INF/classes/confluence-init.properties
# 设置confluence.home=/path/to/confluenceHome
  1. 启动服务:
bin/start-confluence.sh

漏洞复现步骤

第一步:上传恶意文件

  1. 构造POST请求上传文件:
POST /plugins/drag-and-drop/upload.action?pageId=65601&filename=../../path/to/target.jsp&size=754&minorEdit=true&spaceKey=ADMIN&mimeType=application%2Foctet-stream&atl_token=47ae1afbc53f1ed100a4c36053de2d754d48ffeb&contentType=page&isVFMSupported=true&name=malicious.jsp

关键参数说明

  • filename:包含路径穿越的恶意路径(漏洞利用点)
  • size:必须与Content-Length值一致,否则会导致500错误
  • 其他参数保持正常上传时的值
  1. 文件将被暂存到:
    attachments/ver003//56/98/98306/101/65/65601/917509/1

第二步:触发文件写入

  1. 访问"全部附件"页面,确认上传的文件显示正常

  2. 触发下载全部附件:

GET /pages/downloadallattachments.action?pageId=65601

漏洞触发过程

  1. 服务端获取附件列表:attachmentManager.getLatestVersionsOfAttachments()
  2. 对每个附件执行:
    File tmpFile = new File(getTempDirectoryForZipping(), attachment.getFileName());
    InputStream inputStream = attachmentManager.getAttachmentData(attachment);
    ByteStreams.copy(inputStream, new FileOutputStream(tmpFile));
    
  3. 由于attachment.getFileName()未过滤../,导致路径穿越

验证利用

  1. 检查目标路径是否生成了恶意文件
  2. 访问写入的JSP文件确认是否执行成功

漏洞分析

漏洞根源

  1. 文件上传阶段

    • filename参数未对路径穿越字符(../)进行过滤
    • 文件内容被暂存到临时目录,但保留了原始文件名信息
  2. 文件写入阶段

    • DownloadAllAttachmentsOnPageAction类中直接使用attachment.getFileName()构造文件路径
    • 未对文件名进行安全处理,导致路径穿越

关键代码分析

漏洞代码(DownloadAllAttachmentsOnPageAction.java):

File tmpFile = new File(getTempDirectoryForZipping(), attachment.getFileName());
InputStream inputStream = this.attachmentManager.getAttachmentData(attachment);
ByteStreams.copy(inputStream, new FileOutputStream(tmpFile));

修复代码

import com.atlassian.confluence.util.io.ConfluenceFileUtils;
File tmpFile = new File(getTempDirectoryForZipping(), 
    ConfluenceFileUtils.extractFileName(attachment.getFileName()));

修复方案使用File.getName()方法仅取文件名最后部分,过滤掉路径穿越字符。

修复方案

官方修复

升级到安全版本:

  • 6.6.13
  • 6.12.4
  • 6.13.4
  • 6.14.3
  • 6.15.2

临时缓解措施

若无法立即升级,可采取以下措施:

  1. 关闭Confluence
  2. 编辑<Confluence部署目录>/conf/server.xml
  3. <host>标签下添加:
<Context path="/pages/downloadallattachments.action" docBase="">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="*"/>
</Context>
  1. 保存并重启Confluence

验证措施是否生效
访问含有2个或以上附件的页面/博客,点击"下载全部",若返回404则说明措施生效(但会禁用"下载全部"功能)

参考链接

  1. Confluence安全公告
  2. JIRA问题跟踪
  3. Java File.getName()文档
Confluence路径穿越漏洞复现与分析(CVE-2019-3398) 漏洞概述 漏洞名称 :Confluence Server和Data Center路径穿越漏洞 CVE编号 :CVE-2019-3398 漏洞类型 :路径穿越导致任意文件写入 影响组件 :downloadallattachments资源 危险等级 :高危(可导致任意代码执行) 受影响版本 2.0.0 ≤ version < 6.6.13 6.7.0 ≤ version < 6.12.4 6.13.0 ≤ version < 6.13.4 6.14.0 ≤ version < 6.14.3 6.15.0 ≤ version < 6.15.2 安全版本 6.6.13 6.12.4 6.13.4 6.14.3 6.15.2 漏洞描述 Confluence Server和Data Center在 downloadallattachments 资源中存在路径穿越漏洞。具有以下权限之一的用户可利用此漏洞: 在Page或Blogs具有添加附件权限的用户 具有创建新空间或个人空间权限的用户 对某空间具有"管理员"权限的用户 攻击者可利用此漏洞将文件写入任意位置,特定条件下可执行任意代码。 环境搭建 下载受影响版本(如6.13.0): 配置Confluence: 启动服务: 漏洞复现步骤 第一步:上传恶意文件 构造POST请求上传文件: 关键参数说明 : filename :包含路径穿越的恶意路径(漏洞利用点) size :必须与Content-Length值一致,否则会导致500错误 其他参数保持正常上传时的值 文件将被暂存到: attachments/ver003//56/98/98306/101/65/65601/917509/1 第二步:触发文件写入 访问"全部附件"页面,确认上传的文件显示正常 触发下载全部附件: 漏洞触发过程 : 服务端获取附件列表: attachmentManager.getLatestVersionsOfAttachments() 对每个附件执行: 由于 attachment.getFileName() 未过滤 ../ ,导致路径穿越 验证利用 检查目标路径是否生成了恶意文件 访问写入的JSP文件确认是否执行成功 漏洞分析 漏洞根源 文件上传阶段 : filename 参数未对路径穿越字符( ../ )进行过滤 文件内容被暂存到临时目录,但保留了原始文件名信息 文件写入阶段 : DownloadAllAttachmentsOnPageAction 类中直接使用 attachment.getFileName() 构造文件路径 未对文件名进行安全处理,导致路径穿越 关键代码分析 漏洞代码 (DownloadAllAttachmentsOnPageAction.java): 修复代码 : 修复方案使用 File.getName() 方法仅取文件名最后部分,过滤掉路径穿越字符。 修复方案 官方修复 升级到安全版本: 6.6.13 6.12.4 6.13.4 6.14.3 6.15.2 临时缓解措施 若无法立即升级,可采取以下措施: 关闭Confluence 编辑 <Confluence部署目录>/conf/server.xml 在 <host> 标签下添加: 保存并重启Confluence 验证措施是否生效 : 访问含有2个或以上附件的页面/博客,点击"下载全部",若返回404则说明措施生效(但会禁用"下载全部"功能) 参考链接 Confluence安全公告 JIRA问题跟踪 Java File.getName()文档