漏洞分析 | Atlassian Confluence模板注入代码执行漏洞(CVE-2023-22527)

Atlassian Confluence是一款企业级协作和文档管理软件,由澳大利亚公司Atlassian开发和维护。它提供了一个集成的平台,使团队能够协作创建、共享和管理项目文档、知识库、会议记录等内容。

2024年1月16日,Atlassian 官方披露了CVE-2023-22527 Atlassian Confluence模板注入代码执行漏洞。攻击者可在无需登录的情况下构造恶意请求导致远程代码执行。建议尽快修复漏洞。

▌漏洞复现

1. 靶场环境搭建

使用以下docker-compose.yaml文件搭建靶场环境。

启动容器后,访问http://your-ip,出现以下界面说明靶场成功。

2. 漏洞利用

使用BurpSuite发送以下数据包:

根据响应头可以看到,Confluence成功回显了/etc/passwd文件信息。

▌漏洞分析

通过接口地址我们找到了该漏洞使用的模版 

首先,需要说明的是这里使用的是Velocity模版引擎,Velocity 主要用于将模板与数据合并,生成文本输出。在 Web 开发中,Velocity 常用于生成动态网页、电子邮件模板、文档等。它支持在模板中嵌入变量、条件语句、循环结构等,使得模板能够根据给定的数据动态地生成内容。

在以上代码的首行中使用了$parameters.label去获取请求体中label参数的值,当我们传入label参数后,这行代码就变成了下面这样:

在这段代码中$stack.findValue的功能是通过变量名称去获取参数的值。

我们通过findValue调试来理解漏洞利用的过程,我们通过调试找到了该方法的位置:

该方法执行时会进入下方findValue(String expr, boolean throwExceptionOnFailure)方法,并将传入的label参数交由this.tryFindValueWhenExpressionIsNotNull方法处理。

tryFindValueWhenExpressionIsNotNull把参数交给tryFindValue处理。

在tryFindValue中,调用getValueUsingOgnl进行处理。

在getValueUsingOgnl中可以看到程序将payload直接传入到了this.ognlUtil.getValue方法中,该方法会将传入的参数进行unicode解码并执行。

一步步跟进后,最终执行payload的方法为compileAndExecute(),在下面断点调试中可发现,this.expressions.get()方法在解析payload时会将内部的unicode编码u0027及单引号等进行处理,使aaa前面的引号与u0027解码后的引号闭合,所以能够顺利执行后面注入的代码,导致攻击成功。

▌塞讯验证规则

针对该漏洞的攻击模拟已经加入到塞讯安全度量验证平台中,您可以在塞讯安全度量验证平台中搜索关键词“CVE-2023-22527”“Atlassian Confluence”获取相关攻击模拟验证动作,从而验证您的安全防御体系是否能够有效应对该漏洞,平台以业界独有方式确保您的验证过程安全无害。

参考来源:

https://jira.atlassian.com/browse/CONFSERVER-93833
https://blog.projectdiscovery.io/atlassian-confluence-ssti-remote-code-execution/
https://confluence.atlassian.com/pages/viewpage.action?pageId=1333335615