在上一章中,我们介绍了如何利用XSS攻击诱使用户在不知情的情况下在应用程序中执行操作。如果受害用户拥有管理权限,使用这种技巧就可以迅速完全侵入应用程序。在这一节中,我们将介绍另外一些可用于诱使其他用户执行操作的方法。这些方法甚至可以用在已防范XSS攻击的应用程序中。
这种类型的攻击也称为会话叠置(session riding),它们与会话劫持攻击密切相关,在攻击过程中,攻击者截获一名用户的会话令牌,因而能够“作为”该用户使用应用程序。但是,通过请求伪造,攻击者根本不需要知道受害者的会话令牌。相反,攻击者利用Web浏览器的正常行为劫持用户的令牌,并通过它提出用户并不打算提出的请求。
请求伪造漏洞分为两种类型:本站点和跨站点。
1.本站点请求伪造
本站点请求伪造(On-Site Request Forgery,OSRF)是一种利用保存型XSS漏洞的常见攻击有效载荷。在上一章介绍的MySpace蠕虫示例中,一位名叫Samy的用户在自己的用户资料中插入一段脚本,致使任何查看其资料的用户在不知情的情况下执行各种操作。另外,即使在XSS漏洞并不存在的地方,保存型OSRF漏洞仍有可能存在,这点常被人们忽视。
以消息公告牌应用程序为例,它允许用户提交可被其他用户查看的数据。该应用程序使用以下请求提交消息:
这个请求将以下内容添加到消息页面中:
在这种情况下,测试员当然会测试其中是否存在XSS漏洞。但是,假设应用程序对插入页面中的任何“、<和>字符进行了正确地HTML编码。如果对这种防御方法感到满意,觉得攻击者无论如何也无法避开它,测试员就会继续进行下一步测试。
但是,稍等。我们控制的仅仅是<img>标签目标的一部分内容。虽然我们无法破坏引用字符串,但是可以修改URL,使得查看消息的任何用户提出任意一个本站点GET请求。例如,在type参数中提交下面的值将会使任何查看消息的用户提出一个尝试创建新的管理用户的请求:
如果一名普通用户被诱使提出攻击者专门设计的请求,攻击当然不会成功。但是,如果管理员查看消息,攻击者就可以建立一个秘密账户。上面的示例证明,即使无法实施XSS攻击,但攻击者仍然能够成功执行OSRF攻击。当然,即使管理员采取了防范措施,禁用了JavaScript,攻击依然能够成功。
注意,在前面的攻击字符串中,#符终止了.gif后缀前面的URL。但是,只需在后缀前插入一个&,构成另外一个请求参数,即可解决以上问题。