
CVE-2023-22515에 대한 단계별 익스플로잇 워크스루: Atlassian Confluence Server 및 Data Center의 심각한 손상된 접근 제어 취약점으로, 원격 관리자 계정 생성을 가능하게 합니다.
영향을 받는 제품: Atlassian Confluence Data Center 및 Confluence Server.
공개일: 2023-10-04.
심각도: Critical (CVSS ~ 10.0).
취약점 유형: Broken Access Control / Improper Authorization → 공격자가 원격으로 관리자 계정을 생성할 수 있습니다.
취약점은 Confluence 설정 메커니즘에 있습니다.
영향: Confluence Data Center 및 Server 8.0.0 ~ 8.5.1.

이는 struts.xml의 SetupCheckInterceptor라는 인터셉터 중 하나에서 비롯됩니다.
struts.xml은 Struts의 중앙 구성 파일입니다.
이 파일은 Confluence가 URL → Action 클래스 → View 템플릿을 매핑하는 방법을 정의합니다.
또한 인터셉터(액션 실행 전/후 요청을 처리하는 클래스)를 선언합니다.

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가 설정 과정(위저드, 라이선스 입력, 관리자 사용자 생성)을 완료했는지 확인합니다.
ContainerManager.isContainerSetup()
→ Spring IoC 컨테이너가 완전히 초기화되었는지 확인합니다.
두 조건 모두 참인 경우:
→ 시스템이 완전히 설정된 상태임을 의미합니다 → 인터셉터가 즉시 "alreadysetup"을 반환합니다.
→ 액션(일반적으로 SetupDatabaseAction, SetupLicenseAction 등의 설정 액션)이 실행되지 않도록 차단합니다.
설정이 완료되지 않은 경우:
→ actionInvocation.invoke()를 호출하여 사용자가 요청한 액션을 계속 실행합니다.
getBootstrapManager() → 일반적으로 DefaultAtlassianBootstrapManager를 반환합니다.
이는 설정 과정에서 모든 핵심 구성 정보를 관리합니다.
DefaultAtlassianBootstrapManager.isSetupComplete 메서드에서 애플리케이션 구성의 isSetupComplete 메서드를 호출하여 설정 완료 여부를 확인하는 것을 볼 수 있습니다.
=> isSetupComplete를 False로 만들면 SetupCheckInterceptor가 "alreadysetup"을 반환하지 않으므로 /setup/setupadministrator.action에 접근할 수 있습니다.
아래에 ServerInfoAction이 있습니다.
ServerInfoAction = Confluence의 공용 Action → 로그인 없이, CSRF 토큰 없이 모든 사용자가 호출할 수 있습니다. 실행되면 "success"를 반환하며, 서버 정보를 표시하는 템플릿으로 매핑됩니다.
ConfluenceActionSupport를 상속받습니다.ConfluenceActionSupport에서 getBootstrapStatusProvider가 우리가 찾고 있는 BootstrapStatusProviderImpl 인스턴스를 반환합니다.
BootstrapStatusProviderImpl에는 애플리케이션 구성을 반환하는 getApplicationConfig 메서드가 있습니다.
ApplicationConfig 내부에 들어가면 setSetupComplete를 확인하는 구현이 있습니다.
setSetupComplete를 false로 설정하는 일련의 메서드 호출 체인을 유추할 수 있습니다.getBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
bootstrapStatusProvider.applicationConfig.setupComplete=false
/server-info.action URL을 이용합니다. 이 URL은 ServerInfoAction이 처리하며, 로그인이 필요 없는 공용 엔드포인트입니다./server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

디버그를 확인해 보겠습니다.
setupComplete (메서드에 전달된 파라미터)
→ false
즉, 메서드가 false 파라미터로 호출되고 있습니다.
this.setupComplete (ApplicationConfig 객체의 인스턴스 변수)
→ true (할당 전).
명령 실행 후 this.setupComplete는 false가 됩니다.

/setup/setupadministrator.action 엔드포인트에 다시 접속해 보면 성공적으로 접근됩니다.
