软件供应链安全:源代码缺陷实例剖析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 XPath注入

2.4.1 XPath注入的概念

XPath是一种用来在XML文档中导航整个XML树的语言,它使用路径表达式来选取XML文档中的节点或者节点集。XPath的设计初衷是作为一种面向XSLT和XPointer的语言,后来独立成为W3C标准。而XPath注入指利用XPath解析器的松散输入和容错特性,能够在URL、表单或其他信息上附带恶意的XPath查询代码,以获得权限信息的访问权并更改这些信息。XPath注入与SQL注入类似,均是通过构造恶意的查询语句对应用程序进行攻击的。本节分析XPath注入产生的原因、危害以及修复方法。

2.4.2 XPath注入的危害

XPath注入的危害比SQL注入更大。由于在SQL中存在权限的概念,因此在程序和数据库中都可以对数据库权限做分配和防护。而XPath中的数据管理不受权限控制,在表单中提交恶意的XPath代码,就可获取权限限制数据的访问权,并可修改这些数据。构造恶意查询获取到系统内部完整的XML文档内容会造成信息泄露。攻击者也可以在获取XML文档内容后进行用户权限提升等。CVE中也有一些与之相关的漏洞信息,如表2-4所示。

表2-4 与XPath注入相关的漏洞信息

2.4.3 实例代码

本节使用实例的完整源代码可参考本书配套资源文件夹,源文件名:CWE643_XPath_Injection__connect_tcp_01.java。

1)缺陷代码

代码片段1:

代码片段2:

上述代码的第51~63行,程序进行tcp连接并读取socket的数据,在第130行、第131行对从socket中读取到的数据进行赋值,并在第138~140行构造XPath查询语句查询对应的节点。正常情况下(如搜索用户名guest,密码为guestPassword的用户),代码执行的查询如下:

如果攻击者输入用户名'or 1=1 or"=',密码'or 1=1 or"=',那么该查询会变成:

这个字符串会在逻辑上使查询一直返回true并将一直允许攻击者访问系统,因此该查询在逻辑上将等同于一个更为简化的查询:

这样就可以查询到文档中存储的所有secret节点的信息。

2)修复代码

上述修复代码的第130行、第131行使用ESAPI(OWASP Enterprise Security API,一个免费、开源的Web应用程序安全控制库,它使程序员可以更轻松地编写安全风险较低的应用程序)对token数组的元素值进行编码,encodeForXPath方法的作用是编码XML特殊字符(如<、>、&、\、"、')。

2.4.4 如何避免XPath注入

(1)对用户的输入进行合理验证,对特殊字符进行转义。过滤可以在客户端和服务器端两边实现,如果可能的话,建议两者同时进行过滤。

(2)创建一份安全字符白名单,确保XPath查询中由用户控制的数值完全来自预定的字符集合,不包含任何XPath元字符。

(3)使用源代码静态分析工具进行自动化的检测,可以有效发现源代码中的XPath注入问题。