尝试访问

http://mdsec.net/auth/104/

http://mdsec.net/auth/117/

http://mdsec.net/auth/120/

http://mdsec.net/auth/125/

http://mdsec.net/auth/129/

http://mdsec.net/auth/135/

6.2.6 忘记密码功能

与密码修改功能一样,重新获得忘记密码的机制常常会引入已在主要登录功能中避免的问题,如用户名枚举。

除这种缺陷外,忘记密码功能设计方面的缺点往往使它成为应用程序总体验证逻辑中最薄弱的环节。下面介绍几种常见的设计缺点。

img002 忘记密码功能常常向用户提出一个次要质询以代替主要登录功能,如图6-5所示。与试图猜测用户密码相比,响应这种质询对攻击者来说更容易一些。母亲的娘家姓、纪念日、最喜欢的颜色等问题的答案要比可能的密码的数量少得多。而且,这些问题的答案常常隐藏在公开的信息中,意志坚定的攻击者无须花费多大精力即可找到答案。

img148

图6-5 账户恢复功能中的次要质询

许多时候,应用程序允许用户在注册阶段设定他们自己的密码恢复质询与响应,而用户很有可能会设置极其不安全的质询,这也许是因为用户错误地认为应用程序仅向他们自己提出这些质询,例如:“我拥有一只船吗?”在这种情况下,希望获得访问权的攻击者可使用自动攻击手段遍历一组已枚举的或常见的用户名,记录所有密码恢复质询,并选择那些看似最容易猜测出的质询发动攻击。(请参阅第14章了解有关如何在自定义攻击中获取这类数据的技巧。)

img002 与密码修改功能一样,即使应用程序开发者在主登录页面阻止攻击者向密码恢复质询的响应发动蛮力攻击,他们也往往会在忘记密码功能中忽略这种攻击的可能性。如果应用程序允许无限制地回答密码恢复质询,那么意志坚定的攻击者就很可能会攻破这个密码。

img002 一些应用程序使用一个简单的密码“暗示”(可由用户在注册阶段配置)代替恢复质询。由于用户错误地认为只有自己才会看到这些暗示,他们往往设置非常明显的暗示,甚至是和密码完全相同的暗示。此外,拥有一组常见或已枚举出的用户名的攻击者可轻易获取大量密码暗示,然后开始实施猜测。

img002 在用户正确响应一个质询后,应用程序即允许用户重新控制他们的账户,这种机制非常容易遭受攻击。执行这种机制的一个相对安全的方法是向用户在注册阶段提供的电子邮件地址发送一个唯一的、无法猜测的、存在时间限制的恢复URL。用户在几分钟内访问这个URL即可设置一个新密码。但是,我们常常会遇到其他一些在设计上存在缺陷的账户恢复机制。

img006  一些应用程序在用户成功响应一个质询后即向其透露现有与遗忘的密码,使攻击者能够无限制地使用该账户,而不会被账户所有者检测出来。即使账户所有者随后修改被攻破的密码,攻击者只需重新回答相同的质询即可获得新密码。

img006  一些应用程序在用户成功完成一个质询后,立即让其进入一个不需验证的会话。这同样使攻击者可无限制地使用该账户,而不会被账户所有者检测出来,甚至不需要知道用户的密码。

img006  一些应用程序采用发送一个唯一恢复URL的机制,但却将这个URL发送至用户在完成质询时指定的电子邮件地址中。除能够记录攻击者所使用的电子邮件地址外,这种方法根本无法提高恢复过程的安全性。

img004  提示  即使应用程序并未提供一个在屏幕上显示的字段,要求用户输入接收恢复URL的电子邮件地址,它仍有可能通过一个隐藏表单字段或cookie传送这个地址。攻击者因此获得双重机会:一方面,可以发现所攻破的用户的电子邮件地址;另一方面,可对这个地址进行修改,用自选的地址接收恢复URL。

img006  一些应用程序允许用户在成功完成一个质询后直接重新设置密码,并且不向用户发送任何电子邮件通知。这意味着直到所有者碰巧再次登录时才会注意到账户被攻击者攻破;而且,如果所有者认为自己一定是忘记了密码,于是用上述方法重新设置密码, 他可能仍然无法发觉账户已被攻破。那么,只是希望偶尔访问应用程序的攻击者就可以在一段时间攻破一个用户账户,在另一段时间攻破另一个不同用户的账户,从而继续无限制地使用该应用程序。