
Procédure pas à pas d'exploitation de la vulnérabilité critique de contrôle d'accès défaillant CVE-2023-22515 dans Atlassian Confluence Server et Data Center, permettant la création à distance de comptes administrateur.
Produit affecté : Atlassian Confluence Data Center & Confluence Server.
Date de publication : 04/10/2023.
Niveau : Critique (CVSS ~ 10.0).
Type de vulnérabilité : Contrôle d'accès cassé / Autorisation inappropriée → permet à un attaquant de créer un compte administrateur à distance.
L'erreur se situe dans le mécanisme de configuration (setup) de Confluence.
Impact : Confluence Data Center & Server 8.0.0 → 8.5.1.

Cela provient de l'un des intercepteurs, à savoir du fichier .
SetupCheckInterceptorstruts.xmlstruts.xml est le fichier de configuration central pour Struts.
Il définit comment Confluence associe URL → classe Action → modèle de vue.
Il déclare également les intercepteurs (classes qui interceptent le traitement de la requête avant/après l'exécution de l'action).

Dans SetupCheckInterceptor, il appelle BootstrapUtils.getBootstrapManager().isSetupComplete()
public String intercept(ActionInvocation actionInvocation) throws Exception {
if (BootstrapUtils.getBootstrapManager().isSetupComplete() && ContainerManager.isContainerSetup())
return "alreadysetup";
return actionInvocation.invoke();
}
Explication
BootstrapUtils.getBootstrapManager().isSetupComplete()
→ Vérifie si Confluence a terminé le processus de configuration (via l'assistant, saisie de licence, création de l'utilisateur admin).
ContainerManager.isContainerSetup()
→ Vérifie si le conteneur Spring IoC a été entièrement initialisé.
Si les deux conditions sont vraies :
→ Cela signifie que le système est entièrement configuré → l'intercepteur renvoie immédiatement "alreadysetup".
→ L'action n'est pas exécutée (il s'agit généralement des actions de configuration telles que SetupDatabaseAction, SetupLicenseAction, …).
Si la configuration n'est pas terminée :
→ Appelle actionInvocation.invoke() → c'est-à-dire qu'il continue l'exécution de l'action demandée par l'utilisateur.
getBootstrapManager() → renvoie généralement DefaultAtlassianBootstrapManager, qui gère l'ensemble des informations de configuration essentielles pendant le processus de configuration.
DefaultAtlassianBootstrapManager.isSetupComplete() : nous pouvons voir que la méthode de configuration de l'application isSetupComplete est appelée pour vérifier si la configuration est terminée ou non.
=> Si nous faisons en sorte que isSetupComplete = False, alors SetupCheckInterceptor ne renverra pas "alreadysetup" et /setup/setupadministrator.action deviendra accessible.
Ci-dessous, nous avons un ServerInfoAction
ServerInfoAction = Action publique dans Confluence → permet à tout utilisateur de l'appeler sans connexion, sans jeton CSRF. Lorsqu'il s'exécute, il renvoie simplement "success" → correspond à un modèle qui affiche les informations du serveur.
ConfluenceActionSupport.ConfluenceActionSupport, nous voyons que getBootstrapStatusProvider renvoie BootstrapStatusProviderImpl, l'implémentation que nous recherchons.
BootstrapStatusProviderImpl, il y a getApplicationConfig qui renvoie la configuration de l'application.
ApplicationConfig, on peut voir qu'elle implémente la vérification setSetupComplete.
setSetupComplete = false :getBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
bootstrapStatusProvider.applicationConfig.setupComplete=false
/server-info.action qui est une URL dans Confluence, traitée par ServerInfoAction car c'est un endpoint public ne nécessitant pas de connexion./server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

Vérifions le débogage :
setupComplete (paramètre passé à la méthode)
→ false
Cela signifie que la méthode est appelée avec le paramètre false.
this.setupComplete (variable d'instance de l'objet ApplicationConfig)
→ true (avant l'affectation).
Lorsque la commande s'exécute → this.setupComplete devient false.

/setup/setupadministrator.action ; cela réussit.
