(1)选择任意一个字符串,该字符串不曾出现在应用程序的任何地方,而且其中仅包含字母字符,因此不可能受到针对XSS过滤的影响。例如:
提交这个字符串,以其作为每个页面的每一个参数,且每次只针对一个参数。
(2)监控应用程序的响应,看其中是否出现同一个字符串。记下参数值被复制到应用程序响应中的每一个参数。这些参数不一定容易受到攻击,但需要对它们进行深入分析,其过程将在后文中描述。
(3)注意,必须测试所有GET与POST请求,检查URL查询字符串与消息主体中的每一个参数。虽然有少数XSS漏洞传送机制只能通过一个POST请求触发,但仍有可能对漏洞加以利用,如前文所述。
(4)任何时候,一旦在POST请求中发现XSS,应使用Burp中的“更改请求方法”(change request method)选项确定是否可以通过GET请求实施相同的攻击。
(5)除标准的请求参数外,还应该检测HTTP请求消息头内容被应用程序处理的每一种情况。有一种常见的XSS漏洞出现在错误消息中,这时Referer与User-Agent消息头之类的数据项被复制到消息的内容中。这些消息头是传送反射型XSS攻击的有效工具,因为攻击者可以使用一个Flash对象诱使受害者提出一个包含任意HTTP消息头的请求。
2.测试引入脚本的反射
渗透测试员必须手动检查已确定的每一个反射型输入实例,以核实其是否确实可被利用。在响应中包含反射型数据的每个位置,都需要确认该数据的语法特点。这时,渗透测试员必须找到某种修改输入的方法,以便在将输入复制到应用程序响应中的相同位置时,任何脚本都能够得以 执行。下面分析这方面的一些示例。
例1:标签属性值
假设返回的页面中包含以下脚本:
很明显,利用XSS的一种方法是终止包含字符串的双引号,结束<input>标签,然后通过其他方法引入JavaScript脚本(使用<script>等)。例如:
在这种情况下,另一种可以避开某些输入过滤的利用方法,是在<input>标签内注入一个包含JavaScript的事件处理器。例如:
例2: JavaScript字符串
假设返回的页面中包含以下脚本:
这时,受控制的字符串被直接插入到现有的一段脚本中。要利用XSS,可以终止字符串周围的单引号,用一个分号终止整个语句,然后直接处理想要执行的JavaScript。例如:
注意,因为已经终止了一个被引用的字符串,为阻止JavaScript解释器出现错误,必须在注入的代码后使用有效的语法确保脚本继续正常执行。在这个示例中,变量foo被声明,另一个引用字符串被打开,它们将被紧随在字符串后面的代码终止。另一种经常有效的方法是使用//结束输入,将剩下的脚本当做注释处理。
例3:包含URL的特性
假设返回的页面中包含以下脚本:
这时,受控制的字符串插入到一个<a>标签的href属性中。在一些浏览器中,这个属性可能包含一个使用javascript:协议的URL,从而可以使用以下脚本直接利用XSS:
如前所述,因为输入将反射到标签属性中,因此这时还可以注入一个事件处理器。
要向当前所有的浏览器实施攻击,可以同时使用一个无效的图像名称与一个onerror事件处理器:
提示
和其他攻击一样,渗透测试员必须对请求中出现的任何特殊字符进行URL编码,包括& = + ;和空格。