
Analisi tecnica ed exploit proof-of-concept per CVE-2021-26084, una vulnerabilità di iniezione OGNL in Atlassian Confluence Server. Include analisi della causa principale, mappatura dei parametri vulnerabili e guida al rilevamento.
Versioni interessate
Versione < 6.13.23
6.14.0 ≤ Versione < 7.4.11
7.5.0 ≤ Versione < 7.11.6
7.12.0 ≤ Versione < 7.12.5
Causa, metodo di sfruttamento
Confluence utilizza un framework per mappare gli URL alle classi Java, creando quelli che vengono chiamati “action”. Gli URL delle action terminano con “.action” e sono definiti nel file xwork.xml in confluence-.jar e nel file atlassian-plugin.xml all'interno dei file JAR dei plugin inclusi. Ogni action contiene almeno un attributo name, che definisce il nome dell'azione, un attributo class, che definisce la classe Java che implementa l'action, e almeno un elemento result che determina quale template Velocity verrà mostrato dopo che l'action è stata invocata, in base al risultato dell'action. I valori comuni restituiti dalle action sono “error”, “input”, “success”, ma qualsiasi risultato può essere utilizzato se corrisponde a un elemento result nell'XML di XWork. Le action possono contenere un attributo method che consente di chiamare un metodo specifico della classe Java indicata. Quando non viene specificato alcun comando, viene chiamato il metodo doDefault(). Di seguito è riportata la voce di action per createpage-entervariables action:

Il metodo doEnter() della classe com.atlassian.confluence.pages.actions.PageVariablesAction gestisce le richieste a doenterpagevariables.action e restituisce i valori “error”, “input”, “success”. Questo porta alla visualizzazione del template Velocity.

Qui, il valore dell'attributo “name” di un elemento action corrisponde a un percorso /.action e determina quale template verrà mostrato come parte della risposta in base a error/success, ecc. Quindi, in questo esempio, basta accedere a /pages/doenterpagevariables.action per visualizzare il file del template Velocity.

Possiamo vedere come il template Velocity viene visualizzato nella pagina HTML.

Inserendo il nome del tag nel template come parametro, si nota che i valori vengono presi dal parametro della richiesta e restituiti nella risposta.

Uso di #tag: #tag (“attribute1”, “attribute2”, “attribute3”)
Các attribute này trong quá trình render sẽ được lấy tại AbstrctTagDirective.applyAttributes()

#tag ("Hidden" "name='queryString'" "value='ahihihi'")
Dopo che gli attributi sono stati recuperati dal metodo AbstrctTagDirective.applyAttributes(), vengono passati a AbstrctUITag.doEndTag() AbstractUITag.evaluateParams().

Successivamente viene passato a WebWorkTagSupport.findValue() OgnlValueFinder.findValue() con l'espressione.

Successivamente viene passato a SafeExpressionUtil.isSafeExpression().

Qui l'espressione viene passata alla compilazione, controllata contro la blacklist e inserita nella cache. Attraverso la fase di compilazione viene compilata nella forma ASTConst che, quando viene valutata, restituisce la stringa già compilata in precedenza.

Quando all'espressione viene aggiunto il carattere “’” dall'input, viene escapato in entità HTML.

Il punto di escaping è in HtmlAnnotationEscaper.annotatedValueInsert().

Qui viene chiamato il metodo ognl.JavaCharStream.readChar() che valuta i caratteri di escape Unicode, quindi quando si passa “\u0027” questo viene convertito in “’”. Di conseguenza è possibile eseguire l'escape e aggiungere un'espressione OGNL.

Ma è necessario superare la blacklist di OGNL come segue:

È possibile superarla utilizzando gli Array accessors invece del metodo “getClass” o dell'attributo “.class”.
queryString=aaa\u0027%2b#{\u0022\u0022[\u0022class\u0022]}%2b\u0027bbb

Metodo di rilevamento
Monitorare tutte le richieste di traffico HTTP in cui il componente del percorso dell'URI della richiesta contiene una delle stringhe nella colonna "URI Path" della tabella seguente:
Percorso URI | Parametri vulnerabili
/users/darkfeatures.action | featureKey
/users/enabledarkfeature.action | featureKey
/users/disabledarkfeature.action | featureKey
/login.action | token
/dologin.action | token
/signup.action | token
/dosignup.action | token
/pages/createpage-entervariables.action | queryString, linkCreation
/pages/doenterpagevariables.action | queryString
/pages/createpage.action | queryString
/pages/createpage-choosetemplate.action | queryString
/pages/docreatepagefromtemplate.action | queryString
/pages/docreatepage.action | queryString
/pages/createblogpost.action | queryString
/pages/docreateblogpost.action | queryString
/pages/copypage.action | queryString
/pages/docopypage.action | queryString
/plugins/editor-loader/editor.action | syncRev
Se viene trovata una richiesta di questo tipo, controllare il metodo HTTP della richiesta. Se il metodo della richiesta è POST, cercare i Parametri vulnerabili corrispondenti dalla tabella sopra nel corpo della richiesta HTTP; se il metodo della richiesta è GET, cercare i parametri nell'URI della richiesta HTTP. Verificare se il valore di uno qualsiasi dei Parametri vulnerabili contiene la stringa “\u0027” o la sua forma codificata in URL. In tal caso, il traffico deve essere considerato dannoso e potrebbe essere in corso un attacco che sfrutta questa vulnerabilità.