Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

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

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

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

工具目录

分类

查看所有分类
Loading categories
SSRF-CVE-2020-15002 — https://hackerone.com/reports/863553 | Kitploit
工具/GitHubGitHub/skr0x1c0/ssrf-cve-2020-15002
侦察漏洞分析漏洞利用Web应用程序漏洞利用信息收集渗透测试
GitHubskr0x1c0/ssrf-cve-2020-15002

SSRF-CVE-2020-15002

https://hackerone.com/reports/863553

查看仓库
35年前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

概述

处理 /appsuite/api/oxodocumentfilter&action=addfile 时应用的 URL 验证逻辑存在三个缺陷,可被利用来执行检查时使用时(ToCToU)SSRF 攻击。该问题允许恶意行为者对内部网络服务执行 HTTP GET 请求,并可能导致受保护信息泄露。

缺陷 #1:检查时使用时(ToCToU)漏洞

URITools.getFinalURL 方法中的 URL 验证逻辑(实现见此处)存在 ToCToU 漏洞。

URL u = new URL(url);
if (validator.isPresent()) {
    Optional<OXException> exception = validator.get().apply(u);
    if (exception.isPresent()) {
        throw exception.get();
    }
}

URLConnection urlConnnection = u.openConnection();

在上述代码中,输入 URL 主机名的 DNS 解析在检查时(validator.get().apply(u))和使用时(u.openConnection())都会通过调用 InetAddress.getByName 方法进行。因此,如果攻击者能在检查之后、使用之前改变 DNS 解析结果,就可以绕过验证器。单独利用此缺陷极其困难,原因如下:

  1. 默认情况下,如果 DNS 解析成功,InetAddress.getByName 会缓存 DNS 解析结果 30 秒;如果 DNS 解析失败,则缓存 10 秒。
  2. validator.get().apply(u) 与 u.openConnection() 之间的时间间隔极小(对于正常 URL 小于 1 毫秒)。缺陷 #2 用于绕过此限制。

缺陷 #2:输入 URL 的长度未受限

URL 验证器 AddFileAction.validator(实现见此处)不验证输入 URL 的长度。通过提供大尺寸 URL,攻击者可以延长检查时和使用时调用 InetAddress.getByName 方法之间的时间间隔。更大的时间间隔使攻击者更容易利用缺陷 #1。

缺陷 #3:URL 验证器在 DNS 解析失败时允许输入 URL

HostList.contains 方法(实现见此处)在输入 URL 主机名的 DNS 解析失败时返回 false。

// Need to resolve as last resort
try {
    return contains(InetAddress.getByName(toCheck), false);
} catch (UnknownHostException e) {
    // Cannot be resolved
    return false;
}

AddFileAction.validator 调用 blackImageUrlHostlist.contains 方法检查输入 URL 主机名或其解析到的 IP 地址是否在黑名单中。如果攻击者使主机名的 DNS 解析失败,则会跳过 IP 地址检查并接受该 URL。

攻击策略

考虑一个主机名 randomid.dns.pointer.pw,其权威名称服务器由攻击者控制。攻击策略是使 randomid.dns.pointer.pw 的 DNS 解析在检查时(validator.get().apply(u);)失败,并在使用时(u.openConnection())成功。这使攻击者能够绕过 IP 地址黑名单过滤器,对任何被列入黑名单的 IP 地址执行 HTTP GET 请求。攻击者可按照以下步骤实施此攻击:

  1. 通过执行带有请求数据 {"add_imageurl": "http://randomid.dns.pointer.pw"} 的 addfile 操作,触发服务器上的 InetAddress.getByName 缓存。此时,权威 DNS 服务器将被设置为通过返回 SERVFAIL 状态使 randomid.dns.pointer.pw 的 DNS 解析失败。InetAddress.getByName 将缓存此失败结果 10 秒。
  2. 记下收到上述请求响应的时间。这是缓存开始时间。
  3. 指示 pointer.pw 域的权威名称服务器针对主机名 randomid.dns.pointer.pw 的 A 类型 DNS 请求返回 127.0.0.1。
  4. 从缓存开始时间起等待指定时长,以便在下一步中 InetAddress.getByName 在检查时返回缓存的响应(SERVFAIL),并在使用时(url.openConnection())返回 127.0.0.1。
  5. 执行 SSRF 请求,add_imageurl 值设置为格式 http://u{25MB}:[email protected]/path/to/internal/resource.png。这里的 u{25MB} 表示用户名部分是长度为 25 x 1024 x 1024 个字符的字符串。

复现步骤

  1. 从 https://golang.org/dl/ 安装 golang。

  2. 按照指南 https://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Installation_Guide_for_Debian_9.0 和 https://oxpedia.org/wiki/index.php?title=AppSuite:Documents_Installation_Guide#Debian_GNU.2FLinux_9.0_.28valid_from_v7.10.29 在至少 4GB RAM 的虚拟机中安装 Open-Xchange 和 Documents。

  3. 下载并解压 poc.zip 文件。

  4. 打开终端 / 命令行,并将当前目录设置为解压后的 poc.zip 文件夹。

  5. 运行命令

     go run . -serverRoot="http://172.16.66.130" -username="testuser" -password="secret" -targetPath="appsuite/v=7.10.3-9.20200409.083030/apps/themes/logo.png" -targetPort="80" -payloadSize=25 -startSleepDuration=6600
    

    其中 172.16.66.130 是虚拟机的 IP 地址。

下载工具