尝试访问

http://mdsec.net/updates/76/

http://mdsec.net/updates/79/

http://mdsec.net/updates/82/

http://mdsec.net/updates/91/

http://mdsec.net/updates/92/

http://mdsec.net/updates/95/

2.防止开放式重定向漏洞

绝不将用户提交的数据合并到重定向目标中,是避免开放式重定向漏洞的最有效方法。开发者这样做出于各种原因,但通常我们都可以找到替代办法。例如,用户界面中常常包含一组链接,每个链接指向一个重定向页面,并以目标URL为参数。这时,可能的替代方法如下。

img002 从应用程序中删除重定向页面,用直接指向相关目标URL的链接替代指向重定向页面的链接。

img002 建立一个包含所有有效重定向URL的列表。不以参数的形式向重定向页面传送目标URL,而是传送这个列表的索引。重定向页面应在它的列表中查询这个索引,并返回一个指向相关URL的重定向。

如果重定向页面不可避免地要收到用户提交的输入并将它合并到重定向目标中,应使用以下措施降低重定向攻击的风险。

img002 应用程序应在所有重定向中使用相对URL,重定向页面应严格确认它收到的URL为相对URL。它应当确保:用户提交的URL或者以其后接一个字母的斜线字符开头,或者以一个字母开头,并且在第一个斜线前没有冒号。应拒绝,而不是净化任何其他输入。

img002 应用程序应该在所有重定向中使用相对于Web根目录的URL,在发布重定向之前,重定向页面应在所有用户提交的URL前附加http://yourdomainname .com。如果用户提交的URL并不以斜线字符开头,应在它的前面附加http://yourdomainname .com/。

img002 应用程序应对所有重定向使用绝对URL,重定向页面在发布重定向之前,应确认用户提交的URL以http://yourdomainname .com/开头。此外,应拒绝任何其他输入。

和基于DOM的XSS漏洞一样,建议应用程序不要根据DOM数据通过客户端脚本执行重定向,因为这些数据不在服务器的直接控制范围内。

13.4.4 客户端SQL注入

HTML5支持客户端SQL数据库,应用程序可使用该数据库在客户端存储数据。这些数据库使用JavaScript访问,如以下示例所示:

img425

应用程序可以使用此功能将常用数据存储到客户端,然后在需要时将这些数据快速检索到用户界面中。它还允许应用程序以“离线模式”运行,在这种模式下,所有由应用程序处理的数据将驻留在客户端,用户操作也存储在客户端,以便在网络连接可用时与服务器进行同步。

我们在第9章中介绍了如何在服务器端SQL数据库中实施SQL注入攻击,在这种攻击中,攻击者将受其控制的数据以危险的方式插入SQL查询中。实际上,在客户端也可能发生此类攻击。下面列出了一些可能受到这种攻击的应用程序。

img002 社交网络应用程序,这类应用程序将用户的联系人信息存储在本地数据库中,包括联系人姓名和状态更新。

img002 新闻应用程序,这类应用程序将文章和用户评论存储在本地数据库中,以便于离线查看。

img002 Web邮件应用程序,这类应用程序将电子邮件存储在本地数据库中,在离线模式下运行时,则存储待发邮件以便于稍后发送。

在这些情况下,攻击者可以将专门设计的输入包含在受其控制的一组数据中(应用程序在本地存储这些数据),从而实施客户端SQL注入攻击。例如,通过发送一封电子邮件,并在主题行中包含SQL注入攻击代码(如果这些数据嵌入在客户端SQL查询中),就可以攻破收件人用户的本地数据库。如果应用程序以危险的方式使用本地数据库,就可能导致严重的攻击。仅仅使用SQL注入,攻击者就可以从数据库中检索用户已收到的其他邮件的内容,将这些数据复制到发送给攻击者的待发电子邮件,然后将该电子邮件添加到已排队的待发邮件表中。

通常存储在本地数据库中的数据类型可能为SQL元字符,如单引号。因此,在正常使用测试期间即可确定许多SQL注入漏洞,从而实施针对SQL注入攻击的防御机制。和服务器端注入一样,这些防御机制也可以通过各种方法规避,从而实施成功的攻击。

13.4.5 客户端HTTP参数污染

在第9章中,我们介绍了如何在某些情况下使用HTTP参数污染攻击来破坏服务器端应用程序逻辑。有时,这些攻击也可以在客户端实施。

以一个使用以下URL加载收件箱的Web邮件应用程序为例:

img426a

在收件箱中,每封邮件旁显示了几个链接,可用于执行删除、转发和回复等操作。例如,回复第12封邮件的链接如下:

img426b

这些链接中的一些参数将被复制到收件箱URL中。即使应用程序能够有效防范XSS攻击,但攻击者仍然可以构建一个URL,使用在这些链接中回显的其他值来显示收件箱。例如,攻击者可以提供以下参数:

img426c

此参数包含一个URL编码的&字符,应用程序服务器将自动对该字符进行解码。传递给应用程序的start参数的值为:

img426d

如果应用程序接受这个无效值并仍然显示收件箱,同时不加修改地回显该值,用于回复第12封邮件的链接将变为:

img426e

现在,此链接包含两个操作参数——一个指定delete,一个指定reply。和标准的HTTP参数污染一样,在用户单击“回复”链接时,应用程序的行为取决于它如何处理重复的参数。许多时候,应用程序使用第一个值,因此,用户将在不知情的情况下删除任何其尝试回复的邮件。

请注意,在本示例中,用于执行操作的链接包含一个rnd参数,它实际上是一个反CSRF令牌,以防止攻击者通过标准的CSRF攻击轻松诱发这些操作。由于客户端HPP攻击会注入由应用程序构建的现有链接,因此该反CSRF令牌将以正常方式进行处理,因而无法阻止攻击。

在现实世界的大多数Web邮件应用程序中,很可能存在更多可供利用的操作,包括删除所有邮件、转发单个邮件,以及创建通用的邮件转发规则。根据这些操作的实施方式,攻击者就可以在链接中注入若干所需的参数,甚至利用本站重定向功能,以诱使用户执行正常情况下受反CSRF防御保护的复杂操作。此外,攻击者还可以使用多级URL编码,在一个URL中注入几个攻击。在这种情况下,当用户尝试阅读邮件时,将执行一个操作,而当用户尝试返回收件箱时,则会执行另一个操作。