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资源中存在路径穿越漏洞。具有以下权限之一的用户可利用此漏洞:
- 在Page或Blogs具有添加附件权限的用户
- 具有创建新空间或个人空间权限的用户
- 对某空间具有"管理员"权限的用户
攻击者可利用此漏洞将文件写入任意位置,特定条件下可执行任意代码。
环境搭建
- 下载受影响版本(如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
- 配置Confluence:
vi ./confluence/WEB-INF/classes/confluence-init.properties
# 设置confluence.home=/path/to/confluenceHome
- 启动服务:
bin/start-confluence.sh
漏洞复现步骤
第一步:上传恶意文件
- 构造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错误- 其他参数保持正常上传时的值
- 文件将被暂存到:
attachments/ver003//56/98/98306/101/65/65601/917509/1
第二步:触发文件写入
-
访问"全部附件"页面,确认上传的文件显示正常
-
触发下载全部附件:
GET /pages/downloadallattachments.action?pageId=65601
漏洞触发过程:
- 服务端获取附件列表:
attachmentManager.getLatestVersionsOfAttachments() - 对每个附件执行:
File tmpFile = new File(getTempDirectoryForZipping(), attachment.getFileName()); InputStream inputStream = attachmentManager.getAttachmentData(attachment); ByteStreams.copy(inputStream, new FileOutputStream(tmpFile)); - 由于
attachment.getFileName()未过滤../,导致路径穿越
验证利用
- 检查目标路径是否生成了恶意文件
- 访问写入的JSP文件确认是否执行成功
漏洞分析
漏洞根源
-
文件上传阶段:
filename参数未对路径穿越字符(../)进行过滤- 文件内容被暂存到临时目录,但保留了原始文件名信息
-
文件写入阶段:
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
临时缓解措施
若无法立即升级,可采取以下措施:
- 关闭Confluence
- 编辑
<Confluence部署目录>/conf/server.xml - 在
<host>标签下添加:
<Context path="/pages/downloadallattachments.action" docBase="">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="*"/>
</Context>
- 保存并重启Confluence
验证措施是否生效:
访问含有2个或以上附件的页面/博客,点击"下载全部",若返回404则说明措施生效(但会禁用"下载全部"功能)