XPath注入攻击原理及防御

0x01 什么是XPath

XPath 即为 XML 路径语言,是 W3C XSLT 标准的主要元素,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言。

XPath 基于 XML 的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力,可用来在 XML 文档中对元素和属性进行遍历。

0x02 XPath基础语法

1. 查询基本语句
//users/user[name/text()=’abc’ and password/text()=’test123’] 。
这是一个XPath查询语句,获取name为abc的所有user数据,用户需要提交正确的name和password才能返回结果。如果黑客在name字段中输入:’ or 1=1 并在 password 中输入:’ or 1=1 就能绕过校验,成功获取所有user数据
//users/user[name/text()=’‘or 1=1 and password/text()=’'or 1=1]

2. 节点类型
在XPath中,XML文档被作为节点树对待,XPath中有七种结点类型:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。 文档的根节点即是文档结点;对应属性有属性结点,元素有元素结点。
element (元素)
attribute (属性)
text (文本)
namespace (命名空间)
processing-instruction (处理指令)
comment (注释)
root (根节点)

3. 表达式
XPath通过路径表达式(Path Expression)来选取节点,基本规则:
XPath注入攻击原理及防御

0x03 什么是XPath注入攻击

近年来在现代化电子商务,商场现代化系统中,XML技术被广泛 的使用,开始出现针对XML数据信息的XPath注入攻击技术。在XML信息被大量使用,其数据的安全性显得非常重要,但是目前很少有研究人员研究XPath的注入攻击防御技术。

XPath注入攻击是指利用XPath解析器的松散输入和容错特性,能够在URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。XPath注入攻击是针对Web服务应用新的攻击方法,它允许攻击者在事先不知道XPath查询相关知识的情况下,通过XPath查询得到一个XML文档的完整内容。

0x04 XPath注入攻击特点

XPath注入攻击利用两种技术,即XPath扫描和 XPath查询布尔化。通过该攻击,攻击者可以控制用来进行XPath查询的XML数据库。这种攻击可以有效地对付使用XPath查询(和XML数据库) 来执行身份验证、查找或者其它操作。XPath注入攻击同SQL注入攻击类似,但和SQL注入攻击相比较,XPath在以下方面具有优势。

(1) 广泛性。XPath注入攻击利用的是XPath语法,由于XPath是一种标准语言,因此只要是利用XPath语法的Web 应用程序如果未对输入的XPath查询做严格的处理都会存在XPath注入漏洞,所以可能在所有的XPath实现中都包含有该弱点,这和SQL注入攻击有 很大区别。在SQL注入攻击过程中根据数据库支持的SQL语言不同,注入攻击的实现可能不同。

(2) 危害性大。XPath语言几乎可以引用XML文档的所有部分,而这样的引用一般没有访问控制限制。但在SQL注入攻击中,一个“用户”的权限可能被限制到某一特定的表、列或者查询,而XPath注入攻击可以保证得到完整的XML文档,即完整的数据库。只要Web服务应用具有基本的安全漏洞,即可构造针对XPath应用的自动攻击。

0x05 XPath注入的危害

  1. 在URL及表单中提交恶意XPath代码,可获取到权限限制数据的访问权,并可修改这些数据;
  2. 可通过此类漏洞查询获取到系统内部完整的XML文档内容。
  3. 逻辑以及认证被绕过,它不像数据库那样有各种权限,xml没有各种权限的概念,正因为没有权限概念,因此利用xpath构造查询的时候整个数据库都会被用户读取。
  4. 绕过验证、信息泄露

0x06 XPath注入攻击原理

xpath注入的原理其实和sql注入很像,XPath注入攻击主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web应用程序,通过执行XPath查询而执行入侵者想要的操作,但是,注入的对象不是数据库users表了,而是一个存储数据的XML文件。

攻击者可以获取XML数据的组织结构,或者访问在正常情况下不允许访问的数据,如果XML数据被用于用户认证,那么攻击者就可以提升他的权限。因为xpath不存在访问控制,所以我们不会遇到许多在SQL注入中经常遇到的访问限制。XML中没有访问控制或者用户认证,如果用户有权限使用XPath查询,并且之间没有防御系统或者查询语句没有被防御系统过滤,那么用户就能够访问整个XML文档。

以一个普通实例来说,//users/user[username/text()= ' ' or ‘1’ or '1' and password/text()=''],
这个字符串会在逻辑上使查询一直返回 true 并将一直允许攻击者访问系统。攻击者可以利用 XPath 在应用程序中动态地操作 XML 文档。攻击完成登录可以再通过XPath盲入技术获取最高权限账号和其它重要文档信息。延展开来,xpath的注入还有很多花样,像是通过updataxml()函数实现xpath报错注入,还有xpath的盲注。

Blog.xml(存储用户名和密码)
XPath注入攻击原理及防御
Index.php(用于接收传入参数,并进行XML查询)
XPath注入攻击原理及防御
代码很简单,实现了一个简单的登陆验证功能.其实和SQL注入相似,没有对用户输入的数据做过滤,导致攻击者可以直接注入”XPath表达式”。
XPath注入攻击原理及防御

0x07 XPath盲注的方法

XPath盲注主要利用XPath的一些字符串操作函数和运算符。
XPath注入攻击原理及防御

以上一部分的环境为例,$query = "/root/users/user[username/text()='".$name."' and password/text()='".$pwd."']";如果我们想遍历出整个XML文档,一般步骤如下:
1. 利用count(/*)判断跟下节点:
http://127.0.0.1/xpath/index.php?name=’ or count(/*) = 1 or ‘1’ = ‘2
Result: 1
如果有返回结果证明存在一个根节点

2. 利用substring分割根节点的每个字符,猜解第一级节点:
http://127.0.0.1/xpath/index.php?name=’ or substring(name(/[position() = 1]),1,1)=‘r’ or ‘1’=‘2
http://127.0.0.1/xpath/index.php?name=’ or substring(name(/
[position() = 1]),2,1)=‘o’ or ‘1’='2

Result: root

3. 判断root的下一级节点数:
http://127.0.0.1/xpath/index.php?name=’ or count(/root/*) = 2 or ‘1’ = ‘2
Result: 1

4. 猜解root的下一级节点:
http://127.0.0.1/xpath/index.php?name=’ or substring(name(/root/[position() = 1]),1,1)=‘u’ or ‘1’=‘2
http://127.0.0.1/xpath/index.php?name=’ or substring(name(/root/
[position() = 2]),1,1)=‘s’ or ‘1’='2
Result: users

5. 重复上述步骤,直至猜解出所有节点,最后来猜解节点中的数据或属性值

0x08 XPath注入攻击防御技术

(1) 数据提交到服务器上端,在服务端正式处理这批数据之前,对提交数据的合法性进行验证。
(2) 检查提交的数据是否包含特殊字符,对特殊字符进行编码转换或替换、删除敏感字符或字符串。
(3) 对于系统出现的错误信息,以IE错误编码信息替换,屏蔽系统本身的出错信息。
(4) 参数化XPath查询,将需要构建的XPath查询表达式,以变量的形式表示,变量不是可以执行的脚本。如下代码可以通过创建保存查询的外部文件使查询参数化:
declare variable $loginID as xs:string external;
declare variable passwordasxsstringexternal//users/user[@loginID=password as xs:string external; //users/user[@loginID=loginID [email protected]= $password]
(5) 通过MD5、SSL等加密算法,对于数据敏感信息和在数据传输过程中加密,即使某些非法用户通过非法手法获取数据包,看到的也是加密后的信息。

分类:

技术点:

相关文章: