打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CVE-2021-26084-Atlassian Confluence OGNL注入漏洞分析与回显...

漏洞概述

Atlassian Confluence(简称Confluence)是⼀个专业的wiki程序。它是⼀个知识管理的⼯具,通过它可以实现团队成员之间的协作和知识共享。

官方通报此次爆出的漏洞是一个OGNL表达式注入漏洞:

Confluence Security Advisory - 2021-08-25https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html

影响版本:

version < 6.13.23 

6.14.0 ≤ version < 7.4.11 

7.5.0 ≤ version < 7.11.5 

7.12.0 ≤ version < 7.12.5

环境搭建

根据发行Release信息,从官网下载7.12.5和7.12.4版本windows安装包。

atlassian-confluence-7.1 2.4-x64.exehttps://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-7.1 2.4-x64.exe

atlassian-confluence-7.1 2.5-x64.exehttps://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-7.1 2.5-x64.exe

使用默认安装模式Express Install。

选择试用模式。

在接下来的窗口中点击Get an evluation license,注册Atlassian账号,登录后跳转到官网License申请页面。

生成获取licensekey。

设置部署模式。

设置数据库,安装Postgresql。使用默认选项,设置superuser账户口令即可。

登录控制台添加confluence数据库。

完成confluence数据库配置。

选择ExampleSite。

点击Manage users and groups with Confluece

设置管理账户。

完成最后步骤设置。

漏洞复现

搭建7.12.4版本测试,发送的报文如下:

漏洞分析

0x01 补丁对比

补丁对比vm后缀文件,主要有createpage-entervariables.vm、conte nt-editor.vm两个。

对于createpage-entervariables.vm,可以直接全局搜索找到URL映射匹配。梳理出可用的URL,在confluence.jar/xwork.xml中可以找到。

进行表达式测试,如下URL可以成功,参数为queryString。

对于content-editor.vm,需要进一步明确。create-pageform.vm中包含对content-editor.vm的引用。

在content-editor.vm中解析queryString参数。

在xwork.xml中搜索相关URL映射。

最后测试URL,以下接口需要认证。

/pages/createpage.action/pages/docreatepagefromtemplate.action/pages/docreatepage.action/pages/createblogpost.action/pages/docreateblogpost.action

网上传播的/users/darkfeatures.action在本目录下不存在???

备注:补丁分析还可以直接根据:热补丁文件https://confluence.atlassian.com/doc/files/1077906215/1077916296/2/1629 936383093/cve-2021-26084-update.sh

0x02 漏洞调试

添加JRE_HOME环境变量,使用catalina.bat jpda start启动服务,confluence已经在本地(127.0.0.1)默认开启了8000 的调试端口,尝试修改CATALINA_OPTS变量改变Address设置不成功。

使用idea连接本地8000端口,可以成功链接。

根据httpvoid截图提示在SafeParametersInterceptor处下断点,发送payload后成功捕获。

0x03 表达式注入

从补丁对比或者源码审计入手。首先从vm文件中找到类似与如下的表达式问题。

#form_xsrfToken()#tag ('Hidden' 'name='queryString'' 'value='$!queryString'')......#parse ('/pages/includes/version-mismatch.vm')#form_xsrfToken()## TODO - Move hidden tags out if possible.#if ($mode == 'create')#tag ('Hidden' 'name='queryString'' 'value='$!queryString'')

进行表达式注入测试,只有加入简单运算符确认可以处理之后才能真正确定存在表达式注入问题。测试queryString参 数,监控value值。下边大概还原从测试到确认存在表达式注入的过程。

首先进行初步的表达式测试,发现存在%时被过滤; URL编码后的字符被解码显示:

queryString={2+2} '{2 2}'queryString={2*2} '{2*2}'queryString=${2*2} '${2*2}'queryString=%{2*2} ' 'queryString=#{2*2} '#{2*2}'queryString=%23{2*2} '#{2*2}'queryString=%23{2%312*2} '#{212*2}'

当存在反斜杠时,标签不进行渲染;第二个反斜杠被正常显示;输入\\x2f后第二个反斜杠还存在:

queryString=\{2*2} 不返回渲染结果,value标签被置空(value='***'字符串被删除)queryString=\\{2*2} '\{2*2}'queryString=\\x2f{2*2} '\x2f{2*2}'

使用unicode编码,反斜杠不被吃掉:

queryString=\u002f{2*2} '\{2*2}'queryString=\u0022{2*2} '"{2*2}'

根据如下解释:Velocity模板通常使用单引号分割输入,使用\u0027(单引号),返回不被渲染的结果。

“So, knowing f rom the velocity template that the input lies inside single quotes, we tried to break it this time with \u0027 and our suspicion got stronger when the value attribute didn’t get reflected again. Trying again with \u0022 however just gave us value=''”

输入一个unicode编码的单引号,不返回渲染标签;其他字符被html编码:

queryString=\u0027{2*2} 不返回渲染结果,value标签被置空(value='***'字符串被删除)queryString='{2*2} ''{2*2}'queryString=\u0022{2*2} '"{2*2}'

综合前面几步测试结果:可能有这样的结论:

两个\被吃掉一个 + 一个单引号不返回结果,可能原因是表达式计算时存在单引号闭合问题,反斜杠转义导致错 误和单引号被吃掉

设想表达式内容,注入需要闭合单引号,并按照表达式格式进行前后闭合

构造前后同时闭合单引号,发生错误:

queryString=aaa\u0027+123+\u0027 不返回渲染结果,value标签被置空(value='***'字符串被删除)queryString=aaa\u0027%2b123%2b 不返回渲染结果,value标签被置空(value='***'字符串被删除)

添加URL编码,返回字符串拼接结果:

queryString=aaa\u0027%2b123%2b\u0027 'aaa123'queryString=aaa\u0027%2b123%2b\u0027 'aaa123'queryString=aaa\u0027%2b3%2b3%2b\u0027 'aaa33'

进一步使用表达式常见测试向量:

queryString=aaa\u0027%2b{111%2b111}%2b\u0027 'aaa[222]'queryString=aaa\u0027%2b{111%2a111}%2b\u0027 'aaa[12321]'queryString=aaa\u0027%2b#{111%2b111}%2b\u0027 'aaa{222=null}'

通过以上测试基本能够确定表达式注入问题。

0x04 命令执行

首先可以使用#{}获取session变量,而${}不能使用。

queryString=aaa\u0027%2b#{session}%2b\u0027

代码中isSafeExpression函数对输入表达式进行检查。

(1)使用OGNL表达式编译,然后调用containsUnsafeExpression。

(2)使用黑名单方式过滤危险方法、属性和变量。

(3)黑名单定义如下:

这里想到了2种方式,一是基于ScriptEngineManager,另一个是基于BECL字节码。结合OrangeTsai的文章:

可以构造payload实现命令执行。下面是基于ScriptEngineManager方式实现RCE的过程:

回显构造

0x01 基于ScriptEngineManager

依然基于ScriptEngineManager进行构造,print打印函数是无法直接使用的,经过测试发现通过类似于var1='bbb'语句 直接回显最后一个定义的变量。

接下来只要将变量存入一个变量就OK了。

0x02 基于BECL字节码

既然可以执行表达式语句,那么我们完全可以利用com.sun.org.apache.bcel.internal.util.ClassLoader来加载BECL字节码的方式实现RCE,结合Tomcat回显思路,可以实现命令回显:

参考

https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html

https://blog.orange.tw/2018/08/how-i-chained-4-bugs-features-into-rce-on-amazon.html

由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。

点关注,不迷路!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
confluence6.7.1安装与破解
Atlassian Confluence 的中文搜索问题的解决[转]
Atlassian-Atlassian数据中心终极指南 -从功能概述到升级指导-2020.12
解决 Apache Struts S2-059 Struts 远程代码执行漏洞 问题
Struts2值栈
如何将Confluence和JIRA standalone安装到一起l
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服