9.4 注入XPath

XPath(XML路径语言)是一种用于导航XML文档并从中获取数据的解释型语言。许多时候,一个XPath表达式代表由一个文档节点导航到另一个文档节点所需要的一系列步骤。

如果Web应用程序将数据保存在XML文档中,那么它们可能使用XPath访问数据,以响应用户提交的输入。如果这个输入未经任何过滤或净化就插入到XPath查询中,攻击者就可以通过控制查询来破坏应用程序的逻辑,或者获取未获授权访问的数据。

通常,XML文档并不是保存企业数据的首选工具。但是,它们常常被用于保存可根据用户输入获取的应用程序配置数据。小型应用程序也使用它们保存简单的信息,如用户证书、角色和权限。以下面的XML数据为例:

img274a

一个获取所有电子邮件地址的XPath查询如下:

img274b

一个返回Dawes的全部用户资料的查询为:

img274c

在一些应用程序中,用户提交的数据可被直接嵌入到XPath查询中,查询的结果可能在应用程序的响应中返回,或者用于决定应用程序某些方面的行为。

9.4.1 破坏应用程序逻辑

以一个根据用户名和密码获得用户保存的信用卡号码的应用程序功能为例。下面的XPath查询核实用户提交的证书,并获取相关用户的信用卡号码:

img274d

与利用SQL注入漏洞一样,这时攻击者也可以破坏应用程序的查询。例如,提交密码值

img275a

将导致下面的XPath查询,获取所有用户的信用卡信息:

img275b

img001  注解

img002 与SQL注入一样,注入一个数字值时不需要单引号。

img002 与SQL查询不同,XPath查询中的关键字区分大小写,XML文档中的元素名也区分大小写。

9.4.2 谨慎XPath注入

攻击者可利用XPath注入漏洞从目标XML文档中获取任意信息。获取信息的一种可靠途径是使用和上述SQL注入时相同的技巧,促使应用程序根据攻击者指定的条件以不同的方式做出响应。

提交以下两个密码将导致应用程序的不同行为:第一种情况返回结果,但第二种情况不返回结果。

img275c

这种行为差异可用于测试任何特殊条件的真假,因此可通过它一次一个字节地提取出任意信息。与SQL一样,XPath语言也包含一个子字符串函数,可用它一次一个字符地测试一个字符串的值。例如,提交密码

img275d

将导致下面的XPath查询,如果用户Gates密码的第一个字符为M,将返回查询结果:

img275e

轮流针对每个字符位置并测试每个可能的值,攻击者就能够获得Gates的完整密码。