Confluence任意文件读取漏洞(受限)(CVE-2021-26085)分析
字数 1417 2025-08-09 15:23:08

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

1. 漏洞概述

CVE-2021-26085是Atlassian Confluence Server中的一个无需授权的任意文件读取漏洞,影响版本范围:

  • version < 7.4.10
  • 7.5.0 ≤ version < 7.12.3

漏洞位于/s/端点,攻击者可以利用该漏洞读取服务器上的敏感文件,包括但不限于WEB-INF和META-INF目录下的配置文件。

2. 环境搭建

2.1 下载受影响版本

从Atlassian官方下载受影响版本:

https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-X.X.X-x64.bin

将X.X.X替换为需要分析的版本号(如7.12.2)

2.2 安装与配置

  1. 赋予执行权限:

    chmod +x atlassian-confluence-X.X.X-x64.bin
    
  2. 运行安装程序:

    ./atlassian-confluence-X.X.X-x64.bin
    
  3. 默认安装路径:

    /opt/atlassian/confluence/
    

2.3 代码定位

主要代码位于:

/confluence/confluence/WEB-INF/lib/

3. 漏洞分析

3.1 漏洞核心点

漏洞位于com.atlassian.confluence.servlet.rewrite.ConfluenceResourceDownloadRewriteRule类中,涉及URL解码逻辑。

3.2 关键代码对比

修复前

public static boolean shouldUrlDecode(String text) {
    return text != null && (URL_ENCODED_STRING_PATTERN.matcher(text).find() || text.contains("+"));
}

修复后
从单次URL解码改为多次解码(直到无法继续解码)

3.3 正则匹配规则

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).*)");

3.4 重写逻辑

matches方法中:

public RewriteMatch matches(HttpServletRequest request, HttpServletResponse response) {
    String url = this.getNormalisedPathFrom(request);
    // 匹配处理逻辑
    // ...
}

4. 动态调试

4.1 配置调试环境

修改/opt/atlassian/confluence/bin/setenv.sh

CATALINA_OPTS="${CATALINA_OPTS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"

4.2 调试关键点

  1. getNormalisedPathFrom方法设置断点
  2. 观察URL处理流程
  3. 验证URL解码次数

5. 漏洞利用

5.1 利用原理

通过双重URL编码绕过安全检查:

  1. 第一次解码:将双重编码的URL解码为单重编码
  2. 正则匹配:通过/s/端点的检查
  3. 第二次解码:将单重编码解码为原始路径

5.2 POC构造示例

/s/..%252fWEB-INF/web.xml

解码过程:

  1. 第一次解码:..%2fWEB-INF/web.xml
  2. 第二次解码:../WEB-INF/web.xml

6. 修复方案

6.1 官方修复

升级到安全版本:

  • 7.4.10
  • 7.12.3或更高

6.2 修复原理

将单次URL解码改为多次循环解码,直到无法继续解码为止,确保所有编码字符都被正确处理。

7. 漏洞验证

7.1 验证步骤

  1. 构造双重编码的URL请求
  2. 尝试访问WEB-INF或META-INF目录下的文件
  3. 检查返回内容是否包含敏感信息

7.2 验证示例

curl "http://target/s/..%252fWEB-INF/web.xml"

8. 防御措施

  1. 及时升级到安全版本
  2. 限制对/s/端点的访问
  3. 实施严格的输入验证
  4. 使用WAF防护此类攻击

9. 参考链接

  1. Atlassian官方公告:https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html
  2. CVE详情:https://nvd.nist.gov/vuln/detail/CVE-2021-26085
  3. 技术分析参考:https://mp.weixin.qq.com/s/uZ6JIAMXFOV9Pr6l-M1iMg

10. 总结

CVE-2021-26085漏洞展示了URL处理不一致性可能导致的安全问题。通过分析补丁差异、理解URL处理流程、构造双重编码的POC,我们可以深入理解这类漏洞的成因和利用方式。对于企业用户,及时更新补丁是防范此类漏洞的最有效方法。

Confluence任意文件读取漏洞(CVE-2021-26085)深度分析与教学文档 1. 漏洞概述 CVE-2021-26085 是Atlassian Confluence Server中的一个无需授权的任意文件读取漏洞,影响版本范围: version < 7.4.10 7.5.0 ≤ version < 7.12.3 漏洞位于 /s/ 端点,攻击者可以利用该漏洞读取服务器上的敏感文件,包括但不限于WEB-INF和META-INF目录下的配置文件。 2. 环境搭建 2.1 下载受影响版本 从Atlassian官方下载受影响版本: 将X.X.X替换为需要分析的版本号(如7.12.2) 2.2 安装与配置 赋予执行权限: 运行安装程序: 默认安装路径: 2.3 代码定位 主要代码位于: 3. 漏洞分析 3.1 漏洞核心点 漏洞位于 com.atlassian.confluence.servlet.rewrite.ConfluenceResourceDownloadRewriteRule 类中,涉及URL解码逻辑。 3.2 关键代码对比 修复前 : 修复后 : 从单次URL解码改为多次解码(直到无法继续解码) 3.3 正则匹配规则 3.4 重写逻辑 在 matches 方法中: 4. 动态调试 4.1 配置调试环境 修改 /opt/atlassian/confluence/bin/setenv.sh : 4.2 调试关键点 在 getNormalisedPathFrom 方法设置断点 观察URL处理流程 验证URL解码次数 5. 漏洞利用 5.1 利用原理 通过双重URL编码绕过安全检查: 第一次解码:将双重编码的URL解码为单重编码 正则匹配:通过/s/端点的检查 第二次解码:将单重编码解码为原始路径 5.2 POC构造示例 解码过程: 第一次解码: ..%2fWEB-INF/web.xml 第二次解码: ../WEB-INF/web.xml 6. 修复方案 6.1 官方修复 升级到安全版本: 7.4.10 7.12.3或更高 6.2 修复原理 将单次URL解码改为多次循环解码,直到无法继续解码为止,确保所有编码字符都被正确处理。 7. 漏洞验证 7.1 验证步骤 构造双重编码的URL请求 尝试访问WEB-INF或META-INF目录下的文件 检查返回内容是否包含敏感信息 7.2 验证示例 8. 防御措施 及时升级到安全版本 限制对/s/端点的访问 实施严格的输入验证 使用WAF防护此类攻击 9. 参考链接 Atlassian官方公告:https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html CVE详情:https://nvd.nist.gov/vuln/detail/CVE-2021-26085 技术分析参考:https://mp.weixin.qq.com/s/uZ6JIAMXFOV9Pr6l-M1iMg 10. 总结 CVE-2021-26085漏洞展示了URL处理不一致性可能导致的安全问题。通过分析补丁差异、理解URL处理流程、构造双重编码的POC,我们可以深入理解这类漏洞的成因和利用方式。对于企业用户,及时更新补丁是防范此类漏洞的最有效方法。