XSS漏洞表现为各种形式,并且可分为3种类型:反射型、保存型和基于DOM的XSS漏洞。虽然这些漏洞具有一些相同的特点,但在如何确定及利用这些漏洞方面,仍然存在一些重要的差异。下面我们将分别介绍每一类XSS漏洞。
如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞。通常,该页面会使用一个包含消息文本的参数,并在响应中将这个文本返回给用户。对于开发者而言, 使用这种机制非常方便,因为它允许他们从应用程序中调用一个定制的错误页面,而不需要对错误页面中的消息分别进行硬编码。
例如,下面的URL返回如图12-1所示的错误消息:
图12-1 一条动态生成的错误消息
分析返回页面的HTML源代码后,我们发现,应用程序只是简单复制URL中message参数的值,并将这个值插入到位于适当位置的错误页面模板中:
提取用户提交的输入并将其插入到服务器响应的HTML代码中,这是XSS漏洞的一个明显特征;如果应用程序没有实施任何过滤或净化措施,那么它很容易受到攻击。让我们来看看如何实施攻击。
下面的URL经过专门设计,它用一段生成弹出对话框的JavaScript代码代替错误消息:
请求这个URL将会生成一个HTML页面,其中包含以下替代原始消息的脚本:
可以肯定,如果该页面在用户的浏览器中显示,弹出消息就会出现,如图12-2所示。
图12-2 一次概念验证XSS攻击
进行这个简单的测试有助于澄清两个重要问题:首先,message参数的内容可用任何返回给浏览器的数据替代;其次,无论服务器端应用程序如何处理这些数据(如果有),都无法阻止提交JavaScript代码,一旦错误页面在浏览器中显示,这些代码就会执行。