本示例包含一项搜索功能,可用于显示当前用户输入的查询,以及其他用户最近输入的查询列表。由于查询将按原样显示,应用程序将易于受到反射型和保存型XSS攻击。看看是否能够找到这两种漏洞。
http://mdsec.net/search/11/
反射型与保存型XSS攻击在实施步骤上存在两个重要的区别,这也使得后者往往造成更大的安全威胁。
首先,在反射型XSS脚本攻击中,要利用一个漏洞,攻击者必须以某种方式诱使受害者访问他专门设计的URL。而保存型XSS脚本攻击则没有这种要求。在应用程序中展开攻击后,攻击者只需要等待受害者浏览已被攻破的页面或功能。通常,这个页面是一个正常用户将会主动访问的常规页面。
其次,如果受害者在遭受攻击时正在使用应用程序,攻击者就更容易实现其利用XSS漏洞的目的。例如,如果用户当前正在进行会话,那么攻击者就可以劫持这个会话。在反射型XSS攻击中,攻击者可能会说服用户登录,然后单击他们提供的一个链接,从而制造这种情况。或者他可能会部署一个永久性的有效载荷并等待用户登录。但是,在保存型XSS攻击中,攻击者能够保证,受害用户在他实施攻击时已经在访问应用程序。因为攻击有效载荷被保存在用户自主访问的一个应用程序页面中,所以,当有效载荷执行时,任何攻击受害者都在使用应用程序。而且,如果上述页面位于应用程序通过验证的区域内,那么那时攻击受害者一定已经登录。
反射型与保存型XSS攻击之间的这些区别意味着保存型XSS漏洞往往会给应用程序带来更严 重的安全威胁。许多时候,攻击者可以向应用程序提交一些专门设计的数据,然后等待受害者访问它们。如果其中一名受害者是管理员,那么攻击者就能够完全攻破整个应用程序。
反射型和保存型XSS漏洞都表现出一种特殊的行为模式,其中应用程序提取用户控制的数据并以危险的方式将这些数据返回给用户。第三类XSS漏洞并不具有这种特点。在这种漏洞中,攻击者的JavaScript通过以下过程得以执行。
用户请求一个经过专门设计的URL,它由攻击者提交,且其中包含嵌入式JavaScript。
服务器的响应中并不以任何形式包含攻击者的脚本。
当用户的浏览器处理这个响应时,上述脚本得以处理。
这一系列事件如何发生呢?由于客户端JavaScript可以访问浏览器的文本对象模型(Document Object Model,DOM),因此它能够决定用于加载当前页面的URL。由应用程序发布的一段脚本可以从URL中提取数据,对这些数据进行处理,然后用它动态更新页面的内容。如果这样,应用程序就可能易于受到基于DOM的XSS攻击。
回到前面的反射型XSS漏洞中的示例,其中服务器端应用程序将一个URL参数值复制到一条错误消息中。另一种实现相同功能的办法是由应用程序每次返回相同的静态HTML,并使用客户端JavaScript动态生成消息内容。
例如,假设应用程序返回的错误页面包含以下脚本:
这段脚本解析URL,提取出message参数的值,并把这个值写入页面的HTML源代码中。如果按开发者预想的方式调用,它可以和前面的示例中一样,用于创建错误消息。但是,如果攻击者设计出一个URL,并以JavaScript代码作为message参数,那么这段代码将被动态写入页面中,并像服务器返回代码一样得以执行。在这个示例中,前面示例中利用反射型XSS漏洞的同一个URL也可用于生成一个对话框: