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部分可以修改为任意内容,其他部分必须保持不变。
漏洞分析
漏洞触发流程
- 请求处理入口:请求首先被
/s/*模式匹配,由UrlRewriteFilter处理 - URL重写规则:
ConfluenceResourceDownloadRewriteRule类负责处理匹配/s/(.*)/_/(.*)模式的URL - 路径规范化问题:分号(
;)在路径处理中被不当处理,导致安全限制被绕过 - 请求转发:重写后的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重写为实际资源路径,但存在两个关键问题:
- 对分号(
;)处理不当 - 正则表达式中的负向断言
(?!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应用的安全性,防止类似问题的发生。