【问题标题】:What is the security flaw in this authentification process over unsecure HTTP?通过不安全的 HTTP 进行的此身份验证过程中的安全漏洞是什么?
【发布时间】:2017-02-09 01:50:25
【问题描述】:

这里的第一个问题:)

我一直在阅读许多关于如何在没有 https 的情况下安全登录的问题。它们都非常有趣,大多数答案归结为“如果您关心安全性,请使用 SSL!”。我同意这一点,但我也想知道,这个特定过程的缺陷是什么(一个用户(=我),没有会话:密码总是与 标签的完整内容一起发送,它替换该文件的当前内容。):

  • 服务器向页面发送两个变量:随机令牌 A 和 B=派生自 (A)。
  • 客户端发回 md5(password+timestamp+B) 和 A.
  • 服务器从 A 派生 B 以执行与客户端相同的 md5hash 并匹配服务器和客户端的哈希。
  • 服务器允许每个 IP 地址每秒不超过 1 个请求。

假设攻击者知道所有有效的 A 和 B 对,除了重放攻击(在 100 毫秒的时间范围内哈希有效)和他猜对正确哈希的纯粹运气之外,他/她有什么方法可以成功进行身份验证在这个特定的时间范围内?

当然,攻击者仍然可以尝试所有可能的密码,但这不会因为使用 https 而改变。

我并不是说这对于不能使用 https 的网站来说是一个有用的策略,只是想知道是否存在我没​​有想到的理论缺陷。

如果网站目前没有流量,你会如何强行进入?

【问题讨论】:

    标签: security authentication md5 sha256


    【解决方案1】:

    这里有几个缺陷:

    • 您不应该使用 md5。请使用其他哈希算法(例如 sha256)
    • 为了执行您所说的操作,服务器需要以明文形式存储密码。这是一个非常糟糕的做法,如果你被黑了,所有的密码都会被泄露。相反,您应该存储密码的加盐哈希。更多信息在这里:https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet
    • 此方法不可行,因为服务器不可能知道时间戳,除非客户端和服务器的时钟同步到毫秒(不要假设它们会同步)。即使时钟完全同步,这仍然不起作用。从客户端获取时间戳到数据包到达服务器的时间是可变的,服务器需要准确地知道那个时间。如果没有正确的时间戳,服务器将无法计算哈希。删除时间戳会导致重放攻击。
    • 执行中间人攻击的攻击者可以动态更改 HTML(或其他)代码并删除散列函数(假设它是在 JavaScript 中执行的)。然后浏览器将明文传输密码。当然身份验证会失败,但攻击者会知道密码。
    • 可能还存在其他缺陷,但我认为这些足以使该方法效率低下。

    底线:不要使用 HTTP 进行用户身份验证。我还没有听说过任何通过 HTTP 进行安全身份验证的案例。如果 SSL 非常昂贵,则只能将其用于登录页面。这仍然是一个非常糟糕的做法,因为攻击者可以通过窃取会话 cookie(和其他中间人攻击)来执行会话劫持,但至少不会以这种方式泄露密码。

    【讨论】:

    • 感谢您的回答。只是为了澄清几点:服务器上只有一个以明文形式存储的密码(我的)。如果服务器被劫持,我会遇到比泄露密码更严重的问题。但是,您所说的对于保护其他人的密码非常重要,只是不适用于只有一个用户的情况。关于时间戳,它被四舍五入到 100 毫秒(如果证明足够可靠,则四舍五入到 10 毫秒。)您认为我的浏览器中的 HTML 将如何更改?
    • 但是,假设客户端和服务器的时钟完全同步,客户端必须在 100 毫秒内计算出哈希值,然后通过网络发送到服务器。如果您的互联网连接速度不够快,这将始终失败。在执行 MITM 攻击时,在不使用 SSL 时更改 HTML 非常容易。检查像 ettercap 这样的工具。下面是一个简单的脚本,例如:irongeek.com/i.php?page=security/ettercapfilter 您可以更改任何 HTML 内容(脚本等),而不是图像。
    • 如果您对 MITM 攻击的更多详细信息感兴趣,请在此处查看:security.stackexchange.com/questions/72652/…
    • 感谢您提供指向 MITM 答案的链接。我肯定从中学到了一些东西!所以基本上我不能确定我在这里输入的页面是否与 stackoverflow.com 想要发送给我的内容一一对应:) 你能想到任何其他缺陷吗?
    • 没错!有人还可以通过在非 SSL 连接上执行 MITM 来窃取会话 cookie 并劫持您的帐户。他们不会知道您的密码,但他们将能够正常使用您的帐户。这是另一个问题(但我已经在上面提到过)。无论如何,我会尝试考虑更多,但我认为这些是不使用纯 HTTP 的足够理由。除非您想保护自己免受非常基本的脚本小子的伤害。
    【解决方案2】:

    您所描述的是一个较大的程序中的一个次要技术细节,您根本没有详细说明。我假设该过程的更大目的是登录?那么这个代币兑换后会发生什么?用户是否收到某种永久令牌,例如 cookie?那么这很容易受到:

    • 中间人攻击读取所有通信
    • 本地网络数据包嗅探,著名的Firesheep attack宣传

    即使 if(这是一个 large if)这个特定的令牌方案是完美无缺的,整个通信链都可以被第三方和所有私人数据(包括识别 cookie)观察到处于特权网络位置的未经授权的用户可以清楚地阅读 (→ session hijacking)。

    【讨论】:

    • 在我的例子中,过程是这样的:用户编辑一个 html 页面(使用 ),然后通过 ajax 将 html 标签发送到一个 php 脚本,该脚本验证密码是否匹配,如果匹配, 替换请求来自的文件。没有我提到的会话。通信不敏感,因为它只是正在更新的公共页面的内容。也没有涉及 cookie,所以我看不出 Firesheep 攻击是如何应用的。
    • 好的,Firesheep 不适用。但是中间人仍然非常适用。拥有特权网络地位的攻击者可以重写您的请求并更改您尝试上传的任何内容(很可能向其中添加恶意脚本等)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2016-11-21
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多