Openfire存在鉴权绕过漏洞,允许未经身份验证的用户在已配置的 Openfire 环境中使用未经身份验证的 Openfire设置环境,以访问为管理用户保留的 Openfire 管理控制台中的受限页面。
从3.10.0到4.7.4之间的所有版本都受到影响,在4.6.8, 4.7.5, 4.8.0中做了修复。
那么以4.7.4为例,比对一下4.7.5修复的内容:其一:xmppserver/src/main/webapp/WEB-INF/web.xml这实际上是openfire的一个鉴权机制,为了将某些页面,如上图中的登陆页面从鉴权中排除,且为了更灵活而运用了通配符,但也成为了漏洞的利用条件之一,官方在修复中也把配置中的setup-*这一项去除了。其二:xmppserver/src/main/java/org/jivesoftware/admin/AuthCheckFilter.java比较大的改动都在这个文件中,主要集中在testURLPassesExclude函数中:在鉴权机制中匹配到的是setup/setup-*,满足exclude.endsWith("*"),同时url不包含..或者%2e那么就返回true,此时回到doFilter:为true后就break掉了,也就意味着这一路径不需要经过鉴权验证。对于漏洞的修复也是比较简单,直接进行一层url解码。/setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp采用unicode uri替代原本的utf-8,即..=>%u002e来完成绕过。openfire采用内置的Jetty作为Web服务器,带着%u002e的uri进入Jetty,Jetty支持对此类unicode uri的解析,因此转为..,成功绕过访问到log.jsp。从官方的修复角度来看其实能找到类似的漏洞,官方的修复历程为:/setup/setup-/../../log.jsp随后官方就修复了..绕过鉴权,通过添加一层验证,也就是后来被绕过的testURLPassesExclude来对传入的url验证是否含有..:之后官方又添加了对应%2e的验证,然后就出现了现在最新的%u002e的绕过方案,与之类似的还有Eclipse Jetty。来读取web.xml,官方在修复后同样的被绕过的,貌似是分析官方修复补丁时捡漏的一处漏洞,也是采用unicode uri的方式bypass:而在路径放行上,即配置文件中对于setup路径或者是静态文件放行,类似于weblogic console权限绕过,weblogic与openfire类似的,在配置文件中写了鉴权机制,对于css,images等都不需要鉴权,也同样导致了权限绕过。/console/css/%252e%252e%252fconsole.portal<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.修改openfire.xml使控制台仅回环地址访问
<?xml version="1.0" encoding="UTF-8"?>
<jive>
<adminConsole>
<interface>127.0.0.1</interface>
<port>9090</port>
<securePort>9091</securePort>
</adminConsole>
4.使用AuthFilterSanitizer插件
[1] Administration Console authentication bypass
https://github.com/igniterealtime/Openfire/security/advisories/GHSA-gw42-f939-fhvm
[2] (CVE-2021-28164/CVE-2021-34429)Eclipse Jetty WEB-INF敏感信息泄露漏洞分析
https://blog.csdn.net/weixin_50464560/article/details/120608463