Confluence文件读取漏洞分析
字数 2092 2025-08-03 16:47:20

Confluence文件读取漏洞(CVE-2021-26085)深度分析与教学文档

漏洞概述

CVE-2021-26085是Atlassian Confluence中的一个文件读取漏洞,允许攻击者通过精心构造的URL读取服务器上的敏感文件(如WEB-INF/web.xml)。该漏洞源于URL重写机制与路径处理的不当结合,导致可以绕过安全限制访问受保护资源。

漏洞影响版本

  • Confluence 7.4.10之前的所有版本
  • Confluence 7.12.3之前的所有版本
  • Confluence 7.13.0之前的所有版本
  • Confluence 7.14.0之前的所有版本

漏洞POC

/s/123cfx/_/;/WEB-INF/web.xml

其中123cfx部分可以修改为任意内容,其他部分必须保持不变。

漏洞分析

漏洞触发流程

  1. 请求处理入口:请求首先被/s/*模式匹配,由UrlRewriteFilter处理
  2. URL重写规则ConfluenceResourceDownloadRewriteRule类负责处理匹配/s/(.*)/_/(.*)模式的URL
  3. 路径规范化问题:分号(;)在路径处理中被不当处理,导致安全限制被绕过
  4. 请求转发:重写后的URL被转发给DefaultServlet处理,最终读取受保护文件

关键组件分析

UrlRewriteFilter

UrlRewriteFilter是一个用于URL重写的Java Web过滤器,主要功能包括:

  • 将动态URL静态化
  • 便于搜索引擎收录
  • 隐藏URL结构和参数信息
  • 简化复杂URL

在Confluence中的配置:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/s/*</url-pattern>
</filter-mapping>

ConfluenceResourceDownloadRewriteRule

这是Confluence自定义的URL重写规则类,关键匹配模式:

private static final Pattern NO_CACHE_PATTERN = Pattern.compile("^/s/(.*)/NOCACHE(.*)/_/((?i)(?!WEB-INF)(?!META-INF).*)");
private static final Pattern CACHE_PATTERN = Pattern.compile("^/s/(.*)/_/((?i)(?!WEB-INF)(?!META-INF).*)");

该类负责将符合模式的URL重写为实际资源路径,但存在两个关键问题:

  1. 对分号(;)处理不当
  2. 正则表达式中的负向断言(?!WEB-INF)在特定情况下可被绕过

路径处理差异

直接访问路径

当直接访问/;/WEB-INF/web.xml时:

  1. Tomcat的StandardContextValve会检查路径是否以/WEB-INF//META-INF/开头
  2. CoyoteAdapter会对路径进行URL解码和规范化
  3. 规范化过程会移除分号,导致路径变为/WEB-INF/web.xml
  4. 最终被安全机制拦截,返回404

转发访问路径

当通过URL重写转发访问时:

  1. 请求首先被UrlRewriteFilter处理
  2. ConfluenceResourceDownloadRewriteRule将URL重写为/;/WEB-INF/web.xml
  3. 通过RequestDispatcher.forward()进行转发
  4. 转发请求不会再次经过StandardContextValve的安全检查
  5. DefaultServlet最终处理请求并返回文件内容

为什么DefaultServlet会处理请求

  1. 在请求转发过程中,ApplicationContext#getRequestDispatcher会对路径进行规范化
  2. 规范化后的路径为/WEB-INF/web.xml
  3. 由于没有精确匹配的Servlet,请求被交给默认的DefaultServlet处理
  4. DefaultServletserveResource方法负责读取并返回文件内容

漏洞修复

修复版本:

  • 7.4.10
  • 7.12.3
  • 7.13.0
  • 7.14.0

修复方法:
ConfluenceResourceDownloadRewriteRulematches方法中,增加了对分号的编码处理:

  1. 对URL进行多次解码
  2. 将分号;替换为URL编码形式%3b
  3. 确保在路径规范化前分号已被正确处理

修复后的处理流程确保:

  1. 分号在规范化前已被编码
  2. 路径规范化不会意外移除关键字符
  3. 安全检查可以正确识别恶意路径

教学总结

漏洞本质

该漏洞是路径处理不一致导致的权限绕过问题,核心原因包括:

  1. URL重写与路径规范化的处理顺序不当
  2. 分号字符在请求处理链的不同阶段被不同解释
  3. 转发请求与直接请求的安全检查差异

学习要点

  1. URL处理机制:理解Web容器如何处理URL路径,包括解码、规范化等操作
  2. 安全边界:认识到请求转发可能绕过某些安全检查
  3. 防御深度:安全措施应在多个层次实施,不能依赖单一检查点
  4. 编码一致性:确保在系统各组件间对特殊字符的处理保持一致

防御建议

  1. 及时升级到已修复版本
  2. 实施多层防御,包括:
    • 输入验证
    • 输出编码
    • 权限检查
  3. 对特殊字符进行统一处理
  4. 限制对WEB-INFMETA-INF目录的访问,无论通过何种方式

扩展思考

  1. 如何设计更安全的URL重写机制?
  2. 除了分号,还有哪些特殊字符可能导致类似问题?
  3. 如何在应用设计中避免请求转发导致的安全边界突破?
  4. 如何测试Web应用对路径遍历攻击的抵抗力?

通过深入理解此漏洞,可以更好地设计和评估Web应用的安全性,防止类似问题的发生。

Confluence文件读取漏洞(CVE-2021-26085)深度分析与教学文档 漏洞概述 CVE-2021-26085是Atlassian Confluence中的一个文件读取漏洞,允许攻击者通过精心构造的URL读取服务器上的敏感文件(如WEB-INF/web.xml)。该漏洞源于URL重写机制与路径处理的不当结合,导致可以绕过安全限制访问受保护资源。 漏洞影响版本 Confluence 7.4.10之前的所有版本 Confluence 7.12.3之前的所有版本 Confluence 7.13.0之前的所有版本 Confluence 7.14.0之前的所有版本 漏洞POC 其中 123cfx 部分可以修改为任意内容,其他部分必须保持不变。 漏洞分析 漏洞触发流程 请求处理入口 :请求首先被 /s/* 模式匹配,由 UrlRewriteFilter 处理 URL重写规则 : ConfluenceResourceDownloadRewriteRule 类负责处理匹配 /s/(.*)/_/(.*) 模式的URL 路径规范化问题 :分号( ; )在路径处理中被不当处理,导致安全限制被绕过 请求转发 :重写后的URL被转发给 DefaultServlet 处理,最终读取受保护文件 关键组件分析 UrlRewriteFilter UrlRewriteFilter是一个用于URL重写的Java Web过滤器,主要功能包括: 将动态URL静态化 便于搜索引擎收录 隐藏URL结构和参数信息 简化复杂URL 在Confluence中的配置: ConfluenceResourceDownloadRewriteRule 这是Confluence自定义的URL重写规则类,关键匹配模式: 该类负责将符合模式的URL重写为实际资源路径,但存在两个关键问题: 对分号( ; )处理不当 正则表达式中的负向断言 (?!WEB-INF) 在特定情况下可被绕过 路径处理差异 直接访问路径 当直接访问 /;/WEB-INF/web.xml 时: Tomcat的 StandardContextValve 会检查路径是否以 /WEB-INF/ 或 /META-INF/ 开头 CoyoteAdapter 会对路径进行URL解码和规范化 规范化过程会移除分号,导致路径变为 /WEB-INF/web.xml 最终被安全机制拦截,返回404 转发访问路径 当通过URL重写转发访问时: 请求首先被 UrlRewriteFilter 处理 ConfluenceResourceDownloadRewriteRule 将URL重写为 /;/WEB-INF/web.xml 通过 RequestDispatcher.forward() 进行转发 转发请求不会再次经过 StandardContextValve 的安全检查 DefaultServlet 最终处理请求并返回文件内容 为什么DefaultServlet会处理请求 在请求转发过程中, ApplicationContext#getRequestDispatcher 会对路径进行规范化 规范化后的路径为 /WEB-INF/web.xml 由于没有精确匹配的Servlet,请求被交给默认的 DefaultServlet 处理 DefaultServlet 的 serveResource 方法负责读取并返回文件内容 漏洞修复 修复版本: 7.4.10 7.12.3 7.13.0 7.14.0 修复方法: 在 ConfluenceResourceDownloadRewriteRule 的 matches 方法中,增加了对分号的编码处理: 对URL进行多次解码 将分号 ; 替换为URL编码形式 %3b 确保在路径规范化前分号已被正确处理 修复后的处理流程确保: 分号在规范化前已被编码 路径规范化不会意外移除关键字符 安全检查可以正确识别恶意路径 教学总结 漏洞本质 该漏洞是路径处理不一致导致的权限绕过问题,核心原因包括: URL重写与路径规范化的处理顺序不当 分号字符在请求处理链的不同阶段被不同解释 转发请求与直接请求的安全检查差异 学习要点 URL处理机制 :理解Web容器如何处理URL路径,包括解码、规范化等操作 安全边界 :认识到请求转发可能绕过某些安全检查 防御深度 :安全措施应在多个层次实施,不能依赖单一检查点 编码一致性 :确保在系统各组件间对特殊字符的处理保持一致 防御建议 及时升级到已修复版本 实施多层防御,包括: 输入验证 输出编码 权限检查 对特殊字符进行统一处理 限制对 WEB-INF 和 META-INF 目录的访问,无论通过何种方式 扩展思考 如何设计更安全的URL重写机制? 除了分号,还有哪些特殊字符可能导致类似问题? 如何在应用设计中避免请求转发导致的安全边界突破? 如何测试Web应用对路径遍历攻击的抵抗力? 通过深入理解此漏洞,可以更好地设计和评估Web应用的安全性,防止类似问题的发生。