CVE-2022-26134 Confluence Server Data Center OGNL RCE
# 环境
windows server 2016 + Confluence 7.15.1
下载exe然后直接下一步下一步就行了。
web在8090端口,8000是rmi端口。
安装试用版,输入授权码即可。
然后配置数据库
需要额外装一个pgsql,创建一个名为confluence的数据库。
接着选示范站点,然后选在confluence中管理用户。
配置管理员账号密码,然后就安装完成了。
# 分析
官方通告上写了用新的xwork-1.0.3-atlassian-10.jar替换老的xwork-1.0.3-atlassian-8.jar
diff补丁发现
移除了com.opensymphony.xwork.util.TextParseUtil#translateVariables
的调用,跟进这个函数发现这里是ognl表达式执行点。
接下来分两部分来写这个洞
- 正向数据流
- 绕过沙箱
1 正向来看
断点打在com.opensymphony.xwork.ActionChainResult#execute
然后看堆栈
在filter之后由com.opensymphony.webwork.dispatcher.ServletDispatcher#service
做请求分发
getNameSpace从url中获取最后一个斜线之前的内容。
然后走到com.atlassian.confluence.servlet.ConfluenceServletDispatcher#serviceAction
ConfluenceServletDispatcher是ServletDispatcher的子类
在serviceAction中先调用createActionProxy创建一个代理对象,然后调用代理对象的execute函数,在代理对象中我们的payload保存至namespace字段
接着到com.opensymphony.xwork.DefaultActionProxy#execute
这里继续调用com.opensymphony.xwork.DefaultActionInvocation#invoke
其中this.interceptors是拦截器,Confluence默认有28个
然后将自身this传递给interceptor.intercept(this)
,以com.opensymphony.xwork.interceptor.AroundInterceptor
拦截器为例,仍会调用invocation.invoke()
以此形成迭代循环,遍历所有拦截器,在某些拦截器中会返回resultCode为notpermitted
在confluence-7.15.1.jar!\xwork.xml
中,notpermitted对应的type是chain
chain对应com.opensymphony.xwork.ActionChainResult
然后接着执行this.executeResult()
,在executeResult中将this传递给this.result.execute(this)
而this.result
由this.createResult()
创建而来,在createResult中会根据resultCode来构建结果
其中notpermitted对应的result类为com.opensymphony.xwork.ActionChainResult
,所以会进入com.opensymphony.xwork.ActionChainResult#execute
最后在这个地方有ognl,从http的servlet path传递给了ognl执行,造成rce。
2 沙箱
v7.15开始,Confluence在OGNL表达式解析时加入了沙箱设置。在com.opensymphony.xwork.util.TextParseUtil#translateVariables
调用ognl时使用findValue
findValue中存在安全校验
黑名单
|
|
白名单
|
|
还有一个不安全的表达式检查
这里直接用Class.forName拿到关键类就行了,p牛给了payload
|
|
# 拓展
还有一些Result也调用了translateVariables
|
|
简单看了看,没有可控点,先搁着吧。
# 一些其他利用姿势
添加用户
|
|
SetCookie
|
|
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
如果你觉得这篇文章对你有所帮助,欢迎赞赏或关注微信公众号~