CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

admin 2025年1月13日20:04:33评论5 views字数 6358阅读21分11秒阅读模式

★且听安全-点关注,不迷路!

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

★漏洞空间站-优质漏洞资源和小伙伴聚集地!

漏洞信息

最近 Confluence 官方通报了一个严重漏洞 CVE-2022-26134 :

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

从漏洞描述来看,这仍然是一个 OGNL 表达式注入漏洞。影响版本如下:

  •   from 1.3.0 before 7.4.17

  •   from 7.13.0 before 7.13.7

  •   from 7.14.0 before 7.14.3

  •   from 7.15.0 before 7.15.2

  •   from 7.16.0 before 7.16.4

  •   from 7.17.0 before 7.17.4,

  •   from 7.18.0 before 7.18.1

补丁描述:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

主要是修改了 `xwork-1.0.3-atlassian-10.jar` 。下面将深入分析漏洞原理,并尝试绕过沙箱构造命令执行结果回显。

漏洞分析

新版本主要是修改了 `xwork-1.0.3-atlassian-10.jar` 。首先简单进行一下补丁对比:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

改动的地方很多,但是最关键的地方位于 `ActionChainResult#execute` 函数,对提取 `finalNamespace` 和 `finalActionName` 的过程进行了更新。

Confluence 基于 Struts 架构进行开发。我们首先以登录请求为例,对 Confluence 请求处理的流程进行动态调试。访问 `/login.action` ,经过一系列 `Filter` 处理后,将进入Servlet 的分发器 `ServletDispatcher` (本质上是其子类 `ConfluenceServletDispatcher` 对象):

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {    try {        if (this.paramsWorkaroundEnabled) {            request.getParameter("foo");        }        request = this.wrapRequest(request);        this.serviceAction(request, response, this.getNameSpace(request), this.getActionName(request), this.getRequestMap(request), this.getParameterMap(request), this.getSessionMap(request), this.getApplicationMap());    } catch (IOException var5) {        String message = "Could not wrap servlet request with MultipartRequestWrapper!";        log.error(message, var5);        this.sendError(request, response, 500, new ServletException(message, var5));    }}

分别通过函数 `getNameSpace` 、 `getActionName` 、 `getRequestMap` 、 `getSessionMap` 、 `getApplicationMap` 提取相应参数,对应关系如下:

  •   `getNameSpace(request)` -> `namespace`

  •   `getActionName(request)`  -> `actionName`

  •   `getRequestMap(request)` -> `requestMap`

  •   `getParameterMap(request)` -> `parameterMap`

  •   `getSessionMap(request)` -> `sessionMap`

  •   `getApplicationMap()` -> `applicationMap`

然后调用 `serviceAction` 函数,进入子类 `ConfluenceServletDispatcher` 的 `serviceAction` 函数:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

实例化 `DefaultActionProxy` 对象,调用其 `execute` 函数:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

进入 `DefaultActionInvocation#invoke` :

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

这里开始调用 Struts Interceptor 拦截器对象对请求进行处理, `DefaultActionInvocation` 对象拦截器集合 `interceptors` 一共有 32 个:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

函数 `invoke` 尝试通过 `next` 获取下一个拦截器对象,然后调用其 `intercept` 方法,大部分 `Interceptor` 对象的 `intercept` 函数格式如下所示:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

继续调用 `DefaultActionInvocation#invoke` ,从而形成迭代循环。但是在调试中我们发现也有特殊的一些 `Interceptor` ,比如 `ConfluenceAccessInterceptor` :

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

当满足一定条件时并不会继续调用 `DefaultActionInvocation#invoke` ,而是返回字符串 `notpermitted` ,我们分析一下 `isAccessPermitted` 函数:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

主要是通过请求的 `*.action` 和 `methdName` ,来判断当前用户 `currentUser` 是否有访问权限。也就是说,当访问一个无权访问的 `*.action` 时,`DefaultActionInvocation#invoke` 在迭代调用到 `ConfluenceAccessInterceptor#intercept` 后,将返回 `notpermitted`  并赋值给 `resultCode`,从而跳出迭代。我们替换测试请求为 `/index.action`:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

当处理到 `ConfluenceAccessInterceptor` 拦截器时,将不会继续迭代调用下一个拦截器,而是继续往下走,进入 `executeResult` 函数:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

进入 `ActionChainResult#execute` :

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

提取 `namespace` 参数,并调用 `translateVariables` 函数,进入:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

典型的 OGNL 表达式解析过程,前面分析中可知, `namespace` 参数通过 `ServletDispatcher#getNameSpace` 函数获取,查看定义:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

可见 `namespace` 取值为请求 `servletPath` 最后一个 `/` 之前的部分。

根据上面正则表达式规则,要想触发 OGNL 解析,我们很容易构造出相应的 URL :

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

成功触发 OGNL 表达式注入。

沙箱绕过与命令执行

网上现在已经公开的一些利用方式简单粗暴,只能针对 v7.14 及以下系列有效,因为从 v7.15 系列开始,Confluence 在 OGNL 表达式解析时加入了沙箱设置:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

进入 `isSafeExpression` 函数:

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

主要的黑名单如下:

(1) `unsafePropertyNames`

0 = "sun.misc.Unsafe"1 = "classLoader"2 = "java.lang.System"3 = "java.lang.ThreadGroup"4 = "com.opensymphony.xwork.ActionContext                 java.lang.Compiler"5 = "com.atlassian.applinks.api.ApplicationLinkRequestFactory"6 = "java.lang.Thread"7 = "com.atlassian.core.util.ClassLoaderUtils"8 = "java.lang.ProcessBuilder"9 = "java.lang.InheritableThreadLocal"10 = "com.atlassian.core.util.ClassHelper"11 = "class"12 = "java.lang.Shutdown"13 = "java.lang.ThreadLocal"14 = "java.lang.Process"15 = "java.lang.Package"16 = "org.apache.tomcat.InstanceManager"17 = "java.lang.Runtime"18 = "javax.script.ScriptEngineManager"19 = "javax.persistence.EntityManager"20 = "org.springframework.context.ApplicationContext"21 = "java.lang.SecurityManager"22 = "java.lang.Object"23 = "java.lang.Class"24 = "java.lang.RuntimePermission"25 = "javax.servlet.ServletContext"26 = "java.lang.ClassLoader"

(2) `unsafePackageNames`

0 = "java.rmi"1 = "sun.management"2 = "org.apache.catalina.session"3 = "java.jms"4 = "com.atlassian.confluence.util.io"5 = "com.google.common.reflect"6 = "javax.sql"7 = "java.nio"8 = "com.atlassian.sal.api.net"9 = "sun.invoke"10 = "java.util.zip"11 = "liquibase"12 = "com.hazelcast"13 = "org.apache.commons.httpclient"14 = "com.atlassian.util.concurrent"15 = "java.net"16 = "freemarker.ext.jsp"17 = "com.sun.jna"18 = "net.java.ao"19 = "javax"20 = "sun.corba"21 = "org.springframework.util.concurrent"22 = "com.sun.jmx"23 = "sun.misc"24 = "javassist"25 = "ognl"26 = "org.apache.commons.exec"27 = "com.atlassian.cache"28 = "org.wildfly.extension.undertow.deployment                 java.lang.reflect"29 = "io.atlassian.util.concurrent"30 = "java.util.concurrent"31 = "com.atlassian.confluence.util.http"32 = "sun.tracing"33 = "org.objectweb.asm"34 = "freemarker.template"35 = "net.sf.hibernate"36 = "freemarker.core"37 = "net.bytebuddy"38 = "org.apache.tomcat"39 = "freemarker.ext.rhino"40 = "com.atlassian.media"41 = "org.springframework.context"42 = "org.apache.velocity"43 = "javax.xml"44 = "java.sql"45 = "sun.reflect"46 = "sun.net"47 = "javax.persistence"48 = "org.javassist"49 = "javax.naming"50 = "org.apache.httpcomponents.httpclient"51 = "com.atlassian.hibernate"52 = "sun.nio"53 = "com.atlassian.confluence.impl.util.sandbox"54 = "com.google.common.net"55 = "com.atlassian.filestore"56 = "org.apache.commons.io"57 = "com.atlassian.vcache"58 = "jdk.nashorn"59 = "sun.launcher"60 = "oshi"61 = "org.apache.bcel"62 = "sun.rmi"63 = "sun.tools.jar"64 = "org.springframework.expression.spel"65 = "com.opensymphony.xwork.util"66 = "org.ow2.asm"67 = "com.atlassian.confluence.setup.bandana"68 = "org.quartz"69 = "net.sf.cglib"70 = "com.atlassian.activeobjects"71 = "com.atlassian.utils.process"72 = "sun.security"73 = "com.atlassian.quartz"74 = "javax.management"75 = "sun.awt.shell"76 = "com.google.common.cache"77 = "org.apache.http.client"78 = "java.io"79 = "com.atlassian.confluence.util.sandbox"80 = "java.util.jar"81 = "com.atlassian.scheduler"82 = "sun.print"83 = "com.atlassian.failurecache"84 = "com.google.common.io"85 = "org.apache.catalina.core"86 = "org.ehcache"

(3) `unsafeMethodNames`

0 = "getClass"1 = "getClassLoader"

白名单 `allowedClassNames` 如下:

0 = "net.sf.hibernate.proxy.HibernateProxy"1 = "java.lang.reflect.Proxy"2 = "net.java.ao.EntityProxyAccessor"3 = "net.java.ao.RawEntity"4 = "net.sf.cglib.proxy.Factory"5 = "java.io.ObjectInputValidation"6 = "net.java.ao.Entity"7 = "com.atlassian.confluence.util.GeneralUtil"8 = "java.io.Serializable"

此外,对成员函数等也进行了检查( `containsUnsafeExpression` 函数 ):

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

小伙伴看到这里,应该很容易想到多种绕过的方法,感兴趣的小伙伴可以进入漏洞空间站进行交流。其中一种实现命令执行结果回显的方式如下(适用全部受影响的版本):

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

有兴趣学习交流漏洞知识的小伙伴,请加入我们的漏洞空间站-致力于打造优质漏洞资源和小伙伴聚集地!

由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。

★且听安全-点关注,不迷路!

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

★漏洞空间站-优质漏洞资源和小伙伴聚集地!

CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

原文始发于微信公众号(且听安全):CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月13日20:04:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2022-26134 Confluence OGNL RCE 漏洞深入分析和高版本绕过沙箱实现命令回显http://cn-sec.com/archives/1086714.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息