CVE-2023-22515 Critical Privilege Escalation Vulnerability in Atlassian's Confluence
CVE-2023-22515 Critical Privilege Escalation Vulnerability in Atlassian’s Confluence
漏洞描述
CVE-2023-22515 Critical Privilege Escalation Vulnerability in Atlassian’s Confluence 是 Atlassian 公司开发的一款团队合作软件,主要用于团队成员共享知识、协作文档和集中存储资料。它广泛应用于各种组织中,不仅是技术团队,还有其他任何需要文档合作或知识共享的团队。
在8.0.0<CVE-2023-22515 Critical Privilege Escalation Vulnerability in Atlassian’s Confluence<8.2.3、CVE-2023-22515 Critical Privilege Escalation Vulnerability in Atlassian’s Confluence<8.3.3、CVE-2023-22515 Critical Privilege Escalation Vulnerability in Atlassian’s Confluence<8.4.3、CVE-2023-22515 Critical Privilege Escalation Vulnerability in Atlassian’s Confluence<8.5.2中存在权限提升漏洞,导致任意用户可以创建新的管理员账户。
漏洞分析
既然已经修复过了,就按照老样子,分析一下差异,我这里直接用了8.5.1和8.5.2版本的jar来进行分析:

首先重要的变化就是删除和新增了几个类:
删除:
ServerInfoAction
类
ServerInfoFilter
类
新增:
ReadOnlyApplicationConfig
类ReadOnlySetupPersister
类
主要是新增的两个类,可以看到两个ReadOnly
都继承自原有的类,可以看作是一种“增强”,当使用setter的时候,抛出一个UnsupportedOperationException
来拒绝修改,这样就将类变为只读来规避某些风险。
具体就是在BootstrapStatusProviderImpl
的修改中体现的,将原先的this.delegate.getApplicationConfig();
改为return new ReadOnlyApplicationConfig(this.delegate.getApplicationConfig());

那么接下来需要做的就是如何设置这些属性呢?查看interceptors
,和官方的描述,这个SafeParametersInterceptor
引起了我的注意:


把表单内容注入到action properties
,那么八九不离十就是这玩意了,里面都是一些安全检查相关的,尤其是检查@ParameterSafe
这个注解,并且有这么一段doInterceptor
:

这下可好了,那么就直接去看父类,但是点了一下竟然提示我Cannot find declaration to go to
由于比较懒,直接上google搜索一下文档,然后上Github翻源码去了:


看到了具体源码后就明白了,前面获取action
信息后仅仅判断了NoParameters
就进行了setParameters
,这就很明了了:

struts系列的漏洞处理流程interceptor—Action
这段XML配置定义了一个名为params
的拦截器,并指定了该拦截器的具体实现类为com.atlassian.xwork.interceptors.SafeParametersInterceptor

然后就是寻找触发点,直接搜索params
,看来确实有所发现:



看了看所有的stack
,只要下面的action
用的不是setupStack
就都可以使用,多试试应该就可以了(我尝试后发现只有validatingStack
或者什么都不写的用默认的才可以成功,其他的可以进倒是,但是没法创建用户,不知道为啥):

到这里漏洞分析就结束了。
漏洞复现
先弄个环境:


sqlserver
版本太低,直接放弃复现(不是
最后选择弄个PostgreSQL
来代替吧:

然后就成功进入初始界面了,打开bp,然后浏览器访问/setup/setupadministrator-start.action
发现已经没办法进入注册流程了:

覆盖属性后刷新,发现已经可以重新设置管理员了:

新建完成,查看结果:

关于RCE已经有师傅提到了,我打算再看看有没有什么更加方便的方式,如果有发现再发文。