12.3 查找并利用XSS漏洞

确定XSS漏洞的基本方法是使用下面这个概念验证攻击字符串:

img353a

这个字符串被提交给每个应用程序页面中的每一个参数;同时,攻击者监控它的响应,看其中是否出现相同的字符串。如果发现攻击字符串按原样出现在响应中,几乎可以肯定应用程序存在XSS漏洞。

如果仅仅是为了尽可能快地确定应用程序中存在的某种XSS漏洞,以向其他应用程序用户实施攻击,那么这个基本方法可能是最为有效的方法,因为它可以实现高度自动化,而且很少生成错误警报。但是,如果是对应用程序进行复杂的测试,从而确定尽可能多的漏洞,那么在应用基本方法的同时,还需要组合使用更加复杂的技巧。在以下几种情况下,通过基本的检测方法可能无法确定应用程序中存在的XSS漏洞。

img002 许多应用程序实施基于黑名单的初步过滤,试图阻止XSS攻击。通常,这些过滤在请求参数中寻找<script>之类的表达式,并采取一些防御措施,如删除或编码表达式,或者完全阻止这类请求。基本检测方法中常用的攻击字符串往往被这些过滤阻止。但是,仅仅因为一个常见的攻击字符串被阻止,并不能证明一个可利用的漏洞不存在。如后文所述,在有些情况下,不使用<script>标签,甚至不使用"< >和/这些常被过滤掉的字符,也可以利用XSS漏洞。

img002 许多应用程序实施的防XSS过滤存在缺陷,可以通过各种方法避开。例如,假设在处理用户输入前,应用程序删除其中出现的所有<script>标签。这意味着基本方法中使用的攻击字符串将不会在应用程序的响应中返回。但是,以下一个或几个字符串可轻易避开过滤,成功利用XSS漏洞:

img353b