http://mdsec.net/cclookup/14/
在前面的攻击中,注入的测试条件指定了提取数据的绝对路径(address)以及目标字段的名称(surname和password)。实际上,即使不了解这些信息,攻击者仍有可能发动完全盲目的攻击。XPath查询可包含与XML文档中当前节点有关的步骤,因此,从当前节点可以导航到父节点或一个特定的子节点。另外,XPath包含可查询文档元信息(包括特殊元素的名称)的函数。 使用这些技巧就可以提取出文档中所有节点的名称与值,而不必提前知道与它的结构或内容有关的任何信息。
例如,可以使用前面描述的子字符串技巧,通过提交如下格式的密码,提取当前节点的父节点的名称:
这个输入能够返回结果,因为address节点的第一个字母为a。轮到第二个字母,这时可以通过提交下列密码确定该字母为d,因为最后一个输入返回了结果:
确定address节点的名称后,攻击者就可以轮流攻击它的每一个子节点,提取出它们的名称与值。通过索引指定相关子节点可不必知道任何节点的名称。例如,下面的查询将返回值Hunter:
而下面的查询返回值letmein:
这种技巧可用在完全盲目的攻击中,这时应用程序在响应中不返回任何结果,我们可以设计一个注入的条件,通过索引指定目标节点。例如,如果Gates密码的第一个字母为M,提交下面的密码将返回结果:
轮流攻击每个地址节点的每个子节点,并一次一个字符地提取出它们的值,攻击者就可以提取整个XML数据的内容。
提示
XPath中有两个有用的函数,可帮助自动完成上述攻击,迅速遍历XML文档中的所有节点和数据。
count()。这个函数返回指定元素的子节点数量,可用于确定需要遍历的position()值的范围。
string-length()。这个函数返回一个已提交字符串的长度,可用于确定需要遍历的substring()值的范围。