
Análisis técnico y exploit de prueba de concepto para CVE-2021-26084, una vulnerabilidad de inyección OGNL en Atlassian Confluence Server. Incluye desglose de la causa raíz, mapeo de parámetros vulnerables y guía de detección.
Alcance de la afectación
Versión < 6.13.23
6.14.0 ≤ Versión < 7.4.11
7.5.0 ≤ Versión < 7.11.6
7.12.0 ≤ Versión < 7.12.5
Causa, Método de explotación
Confluence utiliza un framework para mapear URLs a clases Java, creando lo que se denomina una "acción". Las URLs de acción terminan en ".action" y se definen en el archivo xwork.xml en confluence-<version>.jar y en el archivo atlassian-plugin.xml dentro de los archivos JAR de los complementos incluidos. Cada acción contiene al menos un atributo name, que define el nombre de la acción, un atributo class, que define la clase Java que ejecuta la acción, y al menos un elemento result que determina la plantilla Velocity que se mostrará después de que se invoque la acción, basado en el resultado de la acción. Los valores comunes devueltos por las acciones son "error", "input", "success", pero cualquier resultado puede usarse si coincide con el elemento result en el XML de XWork. Las acciones pueden contener un atributo method que permite llamar a un método específico de la clase Java especificada. Cuando no se especifica ningún comando, se llama al método doDefault(). A continuación se muestra la entrada de acción para la acción createpage-entervariables:

El método doEnter() de la clase com.atlassian.confluence.pages.actions.PageVariablesAction procesa las solicitudes a doenterpagevariables.action y devuelve los valores "error", "input", "success". Esto lleva a que se renderice la plantilla Velocity.
Aquí, el valor del atributo "name" de un elemento acción corresponde a una ruta / <nameValue>.action y el elemento que contiene la plantilla se mostrará como parte de la respuesta basada en error/success, etc. Así que, según este ejemplo, simplemente accediendo a /pages/doenterpagevariables.action se mostrará el archivo de plantilla Velocity.

Podemos ver cómo se renderiza la plantilla Velocity en la página HTML

Ingresar el nombre de la etiqueta en la plantilla como parámetro y notar que los valores se toman de los parámetros de la solicitud y se devuelven en la respuesta.

Uso de #tag : #tag ("atributo1", "atributo2", "atributo3")
Estos atributos durante el renderizado se obtienen mediante AbstractTagDirective.applyAttributes()

#tag ("Hidden" "name='queryString'" "value='ahihihi'")
Después de que los atributos se extraen mediante el método AbstractTagDirective.applyAttributes(), se pasan a AbstractUITag.doEndTag() → AbstractUITag.evaluateParams()

Luego se pasan a WebWorkTagSupport.findValue() → OgnlValueFinder.findValue() con una expresión

Después se pasa a SafeExpressionUtil.isSafeExpression()

Aquí la expresión se ha compilado, verificado en la lista negra y almacenada en caché. Tras la compilación, se compila a una forma ASTConst que, al evaluarse, devuelve la cadena compilada previamente.

Cuando se agrega una comilla simple ' a la expresión desde la entrada, se escapa a entidad HTML

El punto de escape está en HtmlAnnotationEscaper.annotatedValueInsert()

Aquí se llama al método ognl.JavaCharStream.readChar() que evalúa los caracteres de escape Unicode, por lo tanto, al pasar \u0027 se convierte a '. De esta manera se puede escapar y agregar una expresión OGNL

Pero hay que superar la lista negra de OGNL de la siguiente manera

Se puede superar utilizando accesores de arreglos en lugar del método getClass o la propiedad .class.
queryString=aaa\u0027%2b#{\u0022\u0022[\u0022class\u0022]}%2b\u0027bbb

Método de detección
Supervisar todas las solicitudes de tráfico HTTP donde el componente de ruta de la URI de la solicitud contenga una de las cadenas en la columna "URI Path" de la siguiente tabla:
URI Path | Vulnerable Parameters
/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
Si se encuentra dicha solicitud, se debe verificar el método de la solicitud HTTP. Si el método de solicitud es POST, buscar los Vulnerable Parameters correspondientes de la tabla anterior en el cuerpo de la solicitud HTTP, y si el método de solicitud es GET, buscar los parámetros en la request-URI de la solicitud HTTP. Verificar si el valor de alguno de los Vulnerable Parameters contiene la cadena \u0027 o su forma codificada en URL. Si es así, se considera que el tráfico es malicioso y podría estar ocurriendo un ataque de explotación de esta vulnerabilidad.