Openfire身份认证漏洞分析(CVE-2023-32315)
字数 795 2025-08-24 10:10:13

Openfire身份认证漏洞分析(CVE-2023-32315) 教学文档

1. Openfire简介

Openfire是一个基于XMPP协议的即时通讯服务器/平台,用于搭建即时通讯服务。知名通讯软件如QQ、MSN和Gtalk(Gtalk基于XMPP协议)等都使用类似技术。

在即时通讯中,由于需要保存状态和数据,通常不能采用点对点通讯,而是需要搭建服务器进行消息转发。

2. 漏洞影响版本

  • 3.10.0 <= Openfire < 4.6.8
  • 4.7.0 <= Openfire < 4.7.5

3. 漏洞原理分析

3.1 认证过滤机制

Openfire使用AuthCheckFilter进行URL访问控制,配置文件中定义了免除鉴权的URL模式:

<filter>
    <filter-name>AuthCheck</filter-name>
    <filter-class>org.jivesoftware.admin.AuthCheckFilter</filter-class>
    <init-param>
        <param-name>excludes</param-name>
        <param-value>login.jsp,index.jsp?logout=true,setup/index.jsp,setup/setup-*,.gif,.png,error-serverdown.jsp,loginToken.jsp</param-value>
    </init-param>
</filter>

3.2 认证绕过机制

关键代码在AuthCheckFilter.doFilter()方法中:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
    throws IOException, ServletException {
    
    // 获取请求URL
    String url = request.getRequestURI().substring(1);
    if (url.startsWith("plugins/")) {
        url = url.substring("plugins/".length());
    }
    
    // 检查URL是否在排除列表中
    boolean doExclude = false;
    for (String exclude : excludes) {
        if (testURLPassesExclude(url, exclude)) {
            doExclude = true;
            break;
        }
    }
    
    // 如果doExclude=true则跳过认证
    if (doExclude) {
        chain.doFilter(req, res);
        return;
    }
    // 否则进行认证检查
    // ...
}

3.3 URL匹配逻辑

testURLPassesExclude方法负责检查URL是否匹配排除规则:

public static boolean testURLPassesExclude(String url, String exclude) {
    // 规则以*结尾的情况
    if (exclude.endsWith("*")) {
        if (url.startsWith(exclude.substring(0, exclude.length()-1))) {
            // 检查URL中是否包含".."或"%2e"(URL编码的.)
            if (!url.contains("..") && !url.toLowerCase().contains("%2e")) {
                return true;
            }
        }
    }
    // 规则包含?的情况
    else if (exclude.contains("?")) {
        if (url.equals(exclude)) {
            return true;
        }
    }
    // 其他情况
    else {
        int paramIndex = url.indexOf("?");
        if (paramIndex != -1) {
            url = url.substring(0, paramIndex);
        }
        if (url.equals(exclude)) {
            return true;
        }
    }
    return false;
}

3.4 漏洞根源

虽然代码对..%2e(点号的URL编码)进行了过滤,但Openfire内置的web服务器支持非标准Unicode编码解析(如%u002e),导致可以绕过安全检查。

关键解析代码:

case '%':
    if ((i + 2) < end) {
        char u = path.charAt(i + 1);
        if (u == 'u') {
            // 解码%uxxxx形式的Unicode字符
            builder.append((char)(0xffff & TypeUtil.parseInt(path, i + 2, 4, 16)));
            i += 5;
        } else {
            // 解码%xx形式的ASCII字符
            builder.append((byte)(0xff & (TypeUtil.convertHexDigit(u) * 16 + TypeUtil.convertHexDigit(path.charAt(i + 2)))));
            i += 2;
        }
    }

4. 漏洞复现

4.1 环境搭建

  1. 使用Docker拉取漏洞版本镜像
  2. 启动漏洞环境

4.2 利用方式

使用BurpSuite

  1. 构造包含%u002e的URL请求
  2. 访问需要认证的页面

使用Go工具

cd CVE-2023-32315-Openfire-Bypass/scan_all
go mod tidy
go run main.go -u http://openfire.com:9090

5. 漏洞修复

升级到以下安全版本:

  • Openfire 4.6.8
  • Openfire 4.7.5

6. 总结

该漏洞是由于Openfire的认证过滤机制不完善,未能正确处理Unicode编码的点号(%u002e),导致攻击者可以构造特殊URL绕过认证检查。这与多年前的CVE-2008-6508目录穿越漏洞原理相似。

Openfire身份认证漏洞分析(CVE-2023-32315) 教学文档 1. Openfire简介 Openfire是一个基于XMPP协议的即时通讯服务器/平台,用于搭建即时通讯服务。知名通讯软件如QQ、MSN和Gtalk(Gtalk基于XMPP协议)等都使用类似技术。 在即时通讯中,由于需要保存状态和数据,通常不能采用点对点通讯,而是需要搭建服务器进行消息转发。 2. 漏洞影响版本 3.10.0 <= Openfire < 4.6.8 4.7.0 <= Openfire < 4.7.5 3. 漏洞原理分析 3.1 认证过滤机制 Openfire使用 AuthCheckFilter 进行URL访问控制,配置文件中定义了免除鉴权的URL模式: 3.2 认证绕过机制 关键代码在 AuthCheckFilter.doFilter() 方法中: 3.3 URL匹配逻辑 testURLPassesExclude 方法负责检查URL是否匹配排除规则: 3.4 漏洞根源 虽然代码对 .. 和 %2e (点号的URL编码)进行了过滤,但Openfire内置的web服务器支持非标准Unicode编码解析(如 %u002e ),导致可以绕过安全检查。 关键解析代码: 4. 漏洞复现 4.1 环境搭建 使用Docker拉取漏洞版本镜像 启动漏洞环境 4.2 利用方式 使用BurpSuite 构造包含 %u002e 的URL请求 访问需要认证的页面 使用Go工具 5. 漏洞修复 升级到以下安全版本: Openfire 4.6.8 Openfire 4.7.5 6. 总结 该漏洞是由于Openfire的认证过滤机制不完善,未能正确处理Unicode编码的点号( %u002e ),导致攻击者可以构造特殊URL绕过认证检查。这与多年前的CVE-2008-6508目录穿越漏洞原理相似。