11.2 现实中的逻辑缺陷

掌握理论知识并不是了解逻辑缺陷的最佳办法,通过实例进行学习才是最佳途径。虽然各种逻辑缺陷之间存在巨大的差异,但它们仍包含一些共同特征,并证实开发者总会犯各种各样的错误。因此,从研究逻辑缺陷实例获得的启示有助于攻击者在各种不同的情况下发现新的缺陷。

11.2.1 例1:征求提示

笔者曾在许多不同类型的应用程序中发现“加密提示”漏洞。攻击者可以利用这种漏洞实施各种攻击,如解密打印软件中的域证书或破坏云计算。下面是这种漏洞的一个典型示例,是在一个软件销售站点上发现的。

1.功能

该应用程序实施“记住我”功能,允许应用程序在浏览器中设置一个永久cookie,用户从而无须登录即可访问应用程序。这个cookie受到一个加密算法的保护,以防止篡改或披露。该算法基于一个由姓名、用户ID和不定数据组成的字符串,以确保合成值是唯一的,并且无法预测。为确保能够访问该cookie的攻击者无法实施重放攻击,应用程序还收集机器专用的数据,包括IP地址。

于是,这个cookie被视为一个可靠的解决方案,用于保护业务功能中易受攻击的部分。

除“记住我”功能外,该应用程序还具有另一项功能,将用户的昵称存储在一个名为ScreenName的cookie中。这样,在用户下次访问该站点时,就可以在站点的角落位置收到个性化的问候。鉴于这个名称也属于安全信息,因此也应对它进行加密。

2.假设

开发者认为,与RememberMe cookie相比,ScreenName cookie对攻击者而言价值不大,于是他们决定使用相同的加密算法来保护这两个cookie。他们没有考虑到的是,用户可以指定自己的昵称,并在屏幕上查看该名称。这在无意间使用户能够访问用于保护永久身份验证令牌RememberMe的加密功能(及加密密钥)。

3.攻击方法

在一个简单的攻击中,用户提交其RememberMe cookie的加密值来替代加密的ScreenName cookie。在向用户显示昵称时,应用程序将解密该值,如果解密成功,将在屏幕上显示结果。这个过程生成了如下消息:

img320

虽然这是个有趣的问题,但不一定是个高风险的问题。它只是说明,攻击者可以列出加密的RememberMe cookie的内容,包括用户名、用户ID和IP地址。由于cookie中没有保存密码,攻击 者并没有办法对获得的信息立即加以利用。

真正的问题在于,用户能够指定他们的昵称。因此,用户可以选择自己的昵称,例如:

img321a

如果用户退出系统然后重新登录,应用程序就会加密这个值,将它作为加密的ScreenName cookie存储在用户的浏览器中。如果攻击者提交这个加密的令牌,将它作为RememberMe cookie的值,应用程序就会解密该cookie,读取用户ID,并让攻击者以管理员身份登录。即使应用程序采用三重DES加密,使用强大的密钥并阻止重放攻击,攻击者仍然可以将应用程序作为“加密提示”,以解密并加密任意值。