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 环境搭建
- 使用Docker拉取漏洞版本镜像
- 启动漏洞环境
4.2 利用方式
使用BurpSuite
- 构造包含
%u002e的URL请求 - 访问需要认证的页面
使用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目录穿越漏洞原理相似。