Atlassian Confluence是一款企业级协作和文档管理软件,由澳大利亚公司Atlassian开发和维护。它提供了一个集成的平台,使团队能够协作创建、共享和管理项目文档、知识库、会议记录等内容。
▌漏洞复现
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”获取相关攻击模拟验证动作,从而验证您的安全防御体系是否能够有效应对该漏洞,平台以业界独有方式确保您的验证过程安全无害。
参考来源: