受影响产品: Atlassian Confluence Data Center & Confluence Server。
公开日期: 2023年10月4日。
严重程度: Critical(CVSS ~ 10.0)。
漏洞类型: Broken Access Control / Improper Authorization → 允许攻击者远程创建管理员账户。
漏洞位于 Confluence setup 机制中。
影响范围: Confluence Data Center & Server 8.0.0 → 8.5.1。

这源于 struts.xml 中名为 SetupCheckInterceptor 的拦截器之一。
struts.xml 是 Struts 的核心配置文件。
它定义了 Confluence 如何将 URL 映射到 Action 类 → 视图模板。
同时还声明了 interceptor(在 action 运行前/后拦截处理请求的类)。

在 SetupCheckInterceptor 中调用了 BootstrapUtils.getBootstrapManager().isSetupComplete()
public String intercept(ActionInvocation actionInvocation) throws Exception {
if (BootstrapUtils.getBootstrapManager().isSetupComplete() && ContainerManager.isContainerSetup())
return "alreadysetup";
return actionInvocation.invoke();
}
解释
BootstrapUtils.getBootstrapManager().isSetupComplete()
→ 检查 Confluence 是否已完成 setup 过程(通过向导、输入许可证、创建管理员用户)。
ContainerManager.isContainerSetup()
→ 检查 Spring IoC 容器是否已完整初始化。
如果两个条件都为真:
→ 意味着系统已完成 setup → 拦截器立即返回 "alreadysetup"。
→ 不再继续执行 action(通常是 SetupDatabaseAction、SetupLicenseAction 等 setup action)。
如果尚未完成 setup:
→ 调用 actionInvocation.invoke() → 即继续执行用户请求的 action。
getBootstrapManager() → 通常返回 DefaultAtlassianBootstrapManager,它管理整个 setup 过程中的所有核心配置信息。
DefaultAtlassianBootstrapManager.isSetupComplete 中,我们可以看到它调用了应用程序配置方法 isSetupComplete 来检查 setup 过程是否已完成。
=> 如果我们让 isSetupComplete = False,那么 SetupCheckInterceptor 将不会返回 “alreadysetup”,并且 /setup/setupadministrator.action 将被允许访问。
下面我们有一个 ServerInfoAction
ServerInfoAction = Confluence 中的公开 Action → 允许所有用户无需登录、无需 CSRF token 即可调用。运行时,它只返回 "success" → 映射到一个显示服务器信息的模板。
ConfluenceActionSupportConfluenceActionSupport 中,我们可以看到 getBootstrapStatusProvider 返回 BootstrapStatusProviderImpl,这正是我们要查找的实例。
BootstrapStatusProviderImpl 中,又有 getApplicationConfig 用于返回应用程序配置。
ApplicationConfig 内部,可以看到它实现了 setSetupComplete 的检查。
setSetupComplete 设置为 false。getBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
bootstrapStatusProvider.applicationConfig.setupComplete=false
/server-info.action,这是 Confluence 中的一个 URL,由 ServerInfoAction 处理,因为它是不需要登录的公共端点。/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

让我们检查 Debug:
setupComplete(传入方法的参数)
→ false
即该方法正在以参数 false 被调用。
this.setupComplete(ApplicationConfig 对象的实例变量)
→ true(在赋值之前)。
当命令执行完毕后 → this.setupComplete 将变为 false。

/setup/setupadministrator.action,成功了。
