
Пошаговое руководство по эксплуатации уязвимости CVE-2023-22515, критической уязвимости нарушения контроля доступа в Atlassian Confluence Server и Data Center, позволяющей удаленно создавать учетные записи администратора.

Это исходит от одного из перехватчиков — SetupCheckInterceptor в struts.xml
struts.xml — это центральный файл конфигурации для Struts.
Он определяет, как Confluence сопоставляет URL → класс 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()ContainerManager.isContainerSetup()"alreadysetup".SetupDatabaseAction, SetupLicenseAction и т.д.).actionInvocation.invoke() — то есть продолжается выполнение запрошенного пользователем действия.getBootstrapManager() → обычно возвращает DefaultAtlassianBootstrapManager, который управляет всей основной информацией конфигурации во время настройки.
DefaultAtlassianBootstrapManager.isSetupComplete мы видим, что вызывается метод конфигурации приложения isSetupComplete, чтобы проверить, завершена ли настройка.
=> Если мы сделаем isSetupComplete = False, то SetupCheckInterceptor не вернет “alreadysetup”, и /setup/setupadministrator.action станет доступен.
Ниже у нас есть ServerInfoAction
ServerInfoAction = публичное действие в Confluence → позволяет любому пользователю вызвать его без входа в систему и без CSRF-токена. При выполнении оно возвращает "success" → сопоставляется с шаблоном, отображающим информацию о сервере.
Он наследуется от ConfluenceActionSupport
В ConfluenceActionSupport мы видим, что getBootstrapStatusProvider возвращает BootstrapStatusProviderImpl — экземпляр, который мы ищем.

BootstrapStatusProviderImpl есть метод getApplicationConfig, который возвращает конфигурацию приложения.
ApplicationConfig видно, что он реализует проверку setSetupComplete.
setSetupComplete = falsegetBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
XWorks2 позволяет нам выполнять такую цепочку геттеров/сеттеров, и мы можем сконструировать HTTP-параметр для реализации этой цепочки вызовов методов, используя нотацию, требуемую XWorks2.
bootstrapStatusProvider.applicationConfig.setupComplete=false
Мы воспользуемся /server-info.action — это URL в Confluence, обрабатываемый ServerInfoAction, так как это публичная конечная точка, не требующая входа в систему.
/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

Давайте проверим отладку:
falsefalse.true (перед присваиванием).this.setupComplete станет false.
/setup/setupadministrator.action — успех.
