ASP.NET加密漏洞是否适用于大型LIE?

时间:2010-09-23 13:19:53

标签: asp.net security cryptography

这个问题在某种程度上是How serious is this new ASP.NET security vulnerability and how can I workaround it?的后续问题所以,如果我的问题似乎被打破,请首先阅读这个问题及其已接受的解决方案,然后将其纳入我的问题的背景中。

有人可以解释为什么返回相同的错误页面和相同的自定义错误状态代码很重要吗?我发现这是无关紧要的,特别是如果这是作为其工作的一部分提倡的那样。

脚本/应用程序执行此攻击是否同样容易,而不是特别关注它是否获得http状态代码以及更多结果?即这样做了4000次你被重定向到一个错误页面,在4001你留在同一页面,因为它没有使填充无效?

我知道为什么在错误页面中添加延迟有点相关,但是这也不会只是添加另一层来欺骗脚本以认为该站点是无效目标?

如果脚本考虑到,由于该网站是asp.net,它正在运行AES加密,它会忽略错误页面的时间并监视重定向或缺少重定向作为响应向量,可以做些什么来防止这种情况?如果一个脚本这样做意味着没有办法阻止它吗?

编辑:我接受时间攻击减少但错误页面部分真的看起来很虚伪。此攻击向量将其数据放入视图状态。只有2个案例。通过。失败。

要么失败,要么在页面上,并且视图状态不包含其数据。无论你在这里做什么,都无法删除失败案例,因为除非成功破解密钥,否则页面将永远不会包含其插入的数据。这就是为什么我不能证明使用任何效果的自定义错误的原因。

或者通过,它们位于页面上,并且视图状态包含其插入的数据。

此漏洞摘要


获取WebResoure.axd / ScriptResource.axd中的密码密钥,并使用验证密钥的第一个猜测来生成带有加密文本的潜在密钥值。

此时此值传递给WebResource.axd / ScriptResource.axd,如果解密密钥被正确猜测,他们的响应将被接受,但由于数据是垃圾,因此它正在寻找WebResource.axd / ScriptResource.axd将返回404错误。

如果未成功猜到解密密钥,则填充无效异常将收到500错误。此时,攻击应用程序知道增加潜在的解密密钥值并再次尝试重复,直到它从WebResource.axd / ScriptResource.axd找到第一个成功的404

成功推断出解密密钥后,可以利用该网站查找实际的机器密钥。

4 个答案:

答案 0 :(得分:5)

我将详细说明您引用的my answer in the thread

要解除攻击,应用程序必须以三种不同的方式响应。这三种不同的方式可以是任何东西 - 状态代码,不同的HTML内容,不同的响应时间,重定向或您能想到的任何创造性方式。

我会再次重复 - 攻击者应该能够识别三个不同的响应而不会出现任何错误,否则攻击将无效。

现在提出建议的解决方案。它有效,因为它将三个结果减少到只有两个。它是如何做到的? catch-all错误页面使状态代码/ html / redirect看起来完全相同。随机延迟使得不可能仅基于时间来区分一个或另一个。

所以,它不是谎言,它确实像宣传的那样工作。

<小时/> 编辑:你正在与蛮力攻击混合起来。服务器总会有通过/失败响应,你是对的,无法阻止。但是对于攻击者而言,使用该信息对他的优势将需要数十年和数十亿的请求到您的服务器。

正在讨论的攻击允许攻击者将数十亿请求减少到几千。这是可能的,因为3个不同的响应状态。提议的解决方法可以将其恢复为蛮力攻击,这种攻击不太可能成功。

答案 1 :(得分:5)

重新:

  

这与它们是重定向到200,404还是500有何关联?没人能回答这个,这是根本问题。这就是为什么我打电话给shenanigans需要做这个tom foolery,自定义错误返回200.它只需要为这两个错误返回相同的500页。

我认为原始问题不清楚,我会解决它:

谁说错误需要返回200?这是错的,你只需要所有的错误来返回相同的代码,使得所有错误返回500也会起作用。提议的配置恰好使用了200.

如果您不进行解决方法(即使它自己的版本始终返回500),您将看到404与500的差异。在webresource.axd和scriptresource.axd中尤其如此,因为解密的无效数据是缺少的资源/ 404.

仅仅因为您不知道哪个功能存在问题,并不意味着asp.net中没有功能在不同的场景中提供与填充与无效数据相关的不同响应代码。就个人而言,我不能确定是否还有其他功能可以提供不同的响应代码,我只能告诉你那些2。


  

有人可以解释为什么返回相同的错误页面和相同的自定义错误状态代码很重要吗?我发现这是无关紧要的,特别是如果这是作为其工作的一部分提倡的那样。

斯里兰卡已经在你所关联的问题中非常清楚地回答了这个问题。

它不是隐藏而不是发生错误,而是确保攻击者无法区分错误。具体是关于确保攻击者无法确定请求是否失败,因为它无法解密/填充无效,而因为解密数据是垃圾。

你可以争辩说:好吧,但我可以确保它对应用程序来说不是垃圾。当然,但你需要在应用程序中找到一个允许你这样做的机制,以及攻击的工作方式你总是需要在消息中至少有一点点垃圾。考虑这些:

  • ScriptResource和WebResource都抛出,因此自定义错误会隐藏它。
  • 默认情况下查看状态未加密,因此默认情况下不包含攻击向量。如果您遇到打开加密的麻烦,那么您很可能将其设置为签名/验证它。在这种情况下,解密失败与验证失败是一样的,所以攻击者再也无法知道。
  • Auth票也会签名,因此它就像是视图状态场景
  • 会话Cookie未加密,因此无关紧要

我发布了on my blog攻击目前为止能够伪造身份验证Cookie的方式。

  

脚本/应用程序执行此攻击是否同样容易,而不是特别关注它是否获得http状态代码以及更多结果?即这样做了4000次你被重定向到一个错误页面,在4001你留在同一页面,因为它没有使填充无效?

如上所述,您需要找到一种行为方式,即解密垃圾停留在同一页面而不是抛出异常/从而使您进入同一错误页面。

  

要么失败,要么在页面上,并且视图状态不包含其数据。无论你在这里做什么,都无法删除失败案例,因为除非成功破解密钥,否则页面将永远不会包含其插入的数据。这就是为什么我不能证明使用任何效果的自定义错误的原因。

     

或者通过,它们位于页面上,并且视图状态包含其插入的数据。

阅读我上面提到的关于视图状态的内容。另请注意,在获得解密功能后,可以获得更准确地重新加密的能力。也就是说,如上所述,默认情况下,视图状态不是这样,而且当它通常伴随着签名/验证时。

答案 2 :(得分:1)

不,这不是一个大谎言。有关详细说明,请参阅您引用的问题中的this answer

答案 3 :(得分:1)

解决方法有效,因为:

  • 您没有说明稍微调整后的“多远”。如果您收到另一条错误消息,那就是您可以从中学习的信息。
  • 延迟时间隐藏实际计算所花费的时间。因此,如果您深入了解系统,那么您就无法获得信息,您可以从中学习。