(1)如果一名用户提交的数据在某个位置显示给其他用户,但测试员仍然无法实施保存型XSS攻击,那么在每个这样的位置,检查应用程序的行为是否使得它易于受到OSRF攻击。
(2)用户提交的数据被插入到超链接目标或返回页面中的其他URL等位置时往往会出现漏洞。除非应用程序特别阻止要求的任何字符(通常包括点、斜线及查询字符串中的分隔符), 否则它肯定易于受到攻击。
(3)如果发现OSRF漏洞,则应寻找一个适当的请求作为利用目标,如下一节“跨站点请求伪造”所述。
在将其合并到响应中之前,尽可能严格地确认用户提交的输入,即可防止OSRF漏洞。例如,在前面的示例中,应用程序可能会检查type参数中是否有一组值中的某一个特殊的值。如果应用程序必须接受无法预料的其他值,那么应阻止任何包含/ . \ ? &与 = 的请求。
注意,对这些字符进行HTML编码并不能有效防止OSRF攻击,因为浏览器在请求目标URL字符串之前,会首先对其进行解码。
根据插入点与周围环境的不同,使用与下一节描述的防止CSRF攻击时使用的同种防御方法,也可以防止OSRF攻击。
2.跨站点请求伪造
在跨站点请求伪造(CSRF)攻击中,攻击者只需创建一个看似无害的网站,致使用户的浏览器直接向易受攻击的应用程序提交一个请求,执行某种有利于攻击者的“无意”操作。
如前所述,同源策略并不阻止一个网站向另一个域提出请求。但是,它确实阻止提出请求的网站处理跨域请求的响应。因此,正常情况下,CSRF攻击只是一种“单向”攻击。所以,在纯粹的CSRF攻击中,要想实施如Samy XSS蠕虫中的多阶段操作,从响应中读取数据并将其合并到随后的请求中,将很难实现。(我们将在本章后面部分介绍如何对利用CSRF技巧的某些方法进行扩展,以执行有限的双向攻击,跨域获取数据。)
以某个允许管理员使用以下请求创建新用户账户的应用程序为例:
此请求有3个主要特点导致它易于受到CSRF攻击。
该请求执行特权操作。在上述示例中,该请求使用管理员权限创建了一个新用户。
应用程序仅仅依靠HTTP cookie来追踪会话。请求中的任何其他位置均未传送会话相关的令牌。
攻击者可以确定执行操作所需的所有参数。除cookie中的会话令牌外,请求中不需要包含任何无法预测的值。
针对这些特点表现出的缺陷,攻击者可以构建一个Web页面,向易受攻击的应用程序提出一个跨域请求,在其中包含执行特权操作所需的所有步骤。以下为这种攻击的一个示例:
该攻击将所有请求参数放入隐藏表单字段中,并包含一段用于自动提交表单的脚本。用户的浏览器提交此表单时,将自动添加用户的目标域的cookie,并且应用程序会正常处理生成的请求。如果管理用户登录到易受攻击的应用程序,并访问攻击者的包含此表单的Web页面,该请求将在管理员的会话中处理,攻击者的账户因此得以创建。