如果我的程序使用 HTTPS,使用 Wireshark 的人能否获得完整的 URL?

信息安全 tls http 线鲨
2021-08-20 02:51:51

在仔细阅读 pcap 文件的内容时,我注意到一些 URL 尽管是 HTTPS,但似乎是可见的。这些也主要发生在包含证书 URL 的有效负载中,但我也看到似乎是 HTTP 有效负载中的 HTTPS URL。

有人可以明确地说 HTTPS URL 是否真的保密吗?

我对此感到担忧,因为我想在 URL 中放置一些参数,并且我不希望这些参数被轻易发现。

4个回答

使用 HTTPS,URL 的路径和查询字符串被加密,而如果客户端使用服务器名称指示 (SNI),则主机名在 SSL 握手中以纯文本形式可见。所有现代客户端都使用 SNI,因为这是让不同主机在同一 IP 地址后面拥有自己的证书的唯一方法。

URL 的其余部分(即除主机名之外的所有内容)将仅在加密连接内使用。因此理论上它对攻击者是隐藏的,除非加密本身被破坏(破坏私钥,中间人攻击等)。在实践中,攻击者可能有间接的方式来获取有关 URL 剩余部分的信息:

  • 同一服务器上的不同页面提供不同大小的不同内容等。如果攻击者扫描站点以找出所有可能的页面,那么他可能仅通过查看传输数据的大小就可以找出您访问过哪些页面.
  • 指向其他站点的链接包含Referer 标头。通常,当从 https 链接到 http 时,Referer 会被剥离,但如果攻击者控制了与 https 链接的站点之一,他可能能够找出链接的来源,即您访问过的站点。

但在大多数情况下,使用 HTTPS 是相当安全的,至少比使用纯 HTTP 安全得多。

HTTP 标头(包含请求的 URL)和 HTTPS 中的应用程序数据均已加密。

您可以看到请求的主机名,因为浏览器在握手期间将其发送到服务名称指示扩展中,以便服务器可以选择匹配的 SSL 证书。

使用wireshark,由于SNI,您将能够找到主机名,正如其他一些答案所提到的。此外,您将能够看到证书的某些部分。您看到的 https URL 可能是CRLOCSP的 URL。

如果有人可以通过浏览您的站点来获取您的 URL,并将返回页面的大小与加密页面中返回的大小进行比较,他们可以假设您的程序调用了哪个页面。但是,由于您想将一些参数放入 URL 并隐藏这些参数,因此在您的情况下,这并不是一个大的攻击向量。如果您的 URL 是https://my.server/api?user=scott&password=tiger&highscore=12345,并且您的 api 总是返回 1000 到 1010 字节之间的页面,那么看到返回的 1007 字节不会帮助任何人确定用户或密码或如何输入高分。

然而

只有防止 MITM 攻击,https 才是安全的。fiddlercharlesmitmproxy等工具将您的流量重定向到自己,向客户端提供伪造的证书,解密流量,记录流量,重新加密,并将其发送到原始站点。

如果您的客户端依赖于操作系统的信任库,那么攻击者将能够将他自己的证书插入到信任库中,而您的客户端将不会注意到任何事情。上述工具的自述文件有说明如何做到这一点。

因此,如果您使用 https 来防止解密,则需要在实际发送 URL 之前检查服务器返回的证书是否正确。检查证书固定如何适用于您的操作系统/编程语言,并使用上述工具确保您的客户端将检测到假证书,并且在您发布之前不发送 URL。

可以通过抓取网站和比较数据包大小等来执行流量分析。根据存在多少动态内容或从URL引用的图像,可以非常准确地了解访问了哪些 URL。

演示文稿SSL 流量分析攻击 - 文森特伯格(YouTube) 对其进行了解释并进行了一些功能演示。