【问题标题】:Is it possible to intercept the payload of a secure request in plain text?是否可以以纯文本形式拦截安全请求的有效负载?
【发布时间】:2019-01-09 04:22:33
【问题描述】:

考虑我们运行以下请求:

url="https://secretsub.example.com/secretpath/post.php" 
payload = {'secretmessage1' : 'foo','secretmessage2' : 'bar'}
r = requests.post(url,data=payload,verify=True)

语言(python)是任意的,但它可以是任何其他语言(NodeJs、Java、Php...)的请求

请注意,该 url 使用的是 https,这意味着连接是通过 SSL 保护的。假设我将这个程序编译成二进制(.exe),计算机是否可以通过软件以纯文本形式读取有效载荷?

我知道数据包嗅探软件(如 WireShark)只会以纯文本形式显示域名 (example.com),但不会显示秘密路径或将被加密的有效负载。

如果我在网络 浏览器 中运行此代码(假设它是用 Javascript 编写的),我将能够以普通方式访问有效负载和 secretpath浏览器控制台中的文本。我假设浏览器仅在请求登录其控制台后才对其进行加密。但是如果这段代码在浏览器之外运行,有没有办法让计算机主机以纯文本形式截取这些数据? (某种数据包嗅探工具)

【问题讨论】:

  • 几乎总是可以在在建立连接的设备上看到 SSL 连接的明文。有时有一些日志记录选项可以使其变得简单,有时您将不得不根据平台做一些更复杂或更痛苦的事情。
  • 这是通过默默无闻的安全。工具能够从您那里提取字符串.exe,并将恢复 URL 和有效负载,并且能够重做相同的查询。主机上也可能有一个强制性的 HTTPS 代理(就像 AV 软件一样),它将能够读取所有纯文本。这取决于您的软件是否附带特定的 CA 列表(您正在做 verify=True 这是很棒!)或使用来自底层操作系统的 CA。

标签: security ssl encryption https request


【解决方案1】:

只能看到域名、有效载荷和路径是加密的,并且只能通过客户端和网络服务器之间协商的会话密钥来解密。但是您计算机上的恶意软件可能能够访问它,例如通过访问应用程序使用的内存或通过使用带有某种后门的不安全编程库。

【讨论】:

    【解决方案2】:

    https 正在做的是启动证书交换,因此您的客户端将从服务器接收证书,以验证服务器是谁,并允许客户端通过通道(网络)加密数据。

    第一点 - 验证服务器是他们声称的身份 - 依赖于称为证书链的东西。您收到的证书将使用颁发者私钥进行签名。您的客户应使用您应该“已经拥有”的颁发者公钥检查此证书。

    大多数操作系统都有一个受信任的根证书列表。在 Windows 中,您可以在证书管理器中看到它们。

    在不了解 python 的情况下 - @Patrick Mevzek 暗示您可以提供根 CA(证书颁发机构)或使用操作系统。如果您使用的是操作系统 - 您可能需要检查它是否存在。

    我希望所有这些都是自动的 - 它是您指定的协议的一部分,即 https。但是 - 您可能想与 python 人确认这一点。

    大多数人都忽略了这一切——但这非常重要。如果您不验证证书,那么您很容易受到“中间人”攻击或 DNS 欺骗。

    基本上,我可以使用桌面上的几个工具为 secretsub.example.com 颁发证书。它不会由有效的 CA 签名,但如果您不检查它,那么我可以将该证书放在代理中(中间人) - 当您提出请求时,我的代理将从真实的服务器,建立 HTTP 连接,但将我的证书颁发给您的应用程序。然后,您将使用我的证书加密到我的代理,以便我可以读取您的数据,然后将其转发到真实服务器 - 您永远不会知道! (许多公司代理人对他们的员工就是这样做的)。

    或者,如果我可以更改您的 DNS 以将 IP 指向我的服务器,我几乎可以做同样的事情 - 充当代理。

    完成后,数据将通过网络加密。

    所以 - 是的 HTTPS 将在整个网络中加密 - 但请检查证书是否有效。

    显然,正如有人指出的那样 - 数据在客户端计算机上是清晰的 - 就像它现在在您的浏览器中一样。

    斯图尔特

    【讨论】:

    • 关于不做适当的证书验证,这是应该让许多开发者和库开发者大开眼界的规范论文:cs.utexas.edu/~shmat/shmat_ccs12.pdf
    • 至于 Python 和 CA(但在任何其他语言中都是相同的,所以最终取决于您使用什么“SSL”库以及如何使用它),请参阅docs.python.org/2.7/library/ssl.html#ca-certificates如果您需要验证连接证书的另一端,您需要提供一个“CA 证书”文件,其中包含您愿意信任的每个颁发者的证书链。 [..] 可以通过调用 SSLContext.load_default_certs() 来使用平台的证书文件,[..]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2013-05-15
    • 2020-05-16
    相关资源
    最近更新 更多