Xpath注入学习

xpath简介:

  提到xpath就要先说下xml,xml意为可扩展标记语言,简单来说就是一种存储数据的标准格式,可以把他视为一个小型的数据库,他可以解决数据在网上传输的标准问题。是一种比数据库更具通用性,便捷型的存储形式,因为不同的业务会涉及到不同产品类型的数据库,在更换产品或是接口需求变动的时候往往又要重写接口代码、更改表结构,同时数据库的维护和防火墙的限制也是麻烦,xml的存储形式正好可以弥补这些缺陷,但同样的,xml的轻量级也决定了他无法像数据库那样高效的存储、索引、修改、触发还有访问控制。

  那么xpath呢,他是一种对xml文档进行查询操作的语言,通过使用路径表达式来选取 XML 文档中的节点或节点集,并返回计算后的值。

 

xpath语法:

  nodename:选取此节点的所有子节点

  /  :从根节点选取

  // :从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置

  .  :选取当前节点

  .. :选取当前节点的父节点

  @:选取属性

  *  :匹配任何元素节点

  //*:选取文档中的所有元素

  @*:匹配任何属性节点

  node():匹配任何类型节点

  /bookstore/book[1]:选取属于bookestore子元素的第一个book元素

  //title[@lang]:选取所有拥有名为lang的属性的title元素

  /bookstore/book | //price:选取属于bookstore元素的所有book元素,以及文档中所有的price元素

 

注入原理:

  xpath注入的原理其实和sql注入很像,都是通过语法构造特殊输入,这些输入通过传参的方式拼接到原查询语句后被执行,以获取非预期显示信息。注入的对象不过是换了一个存储形式,同时,因为xpath不存在访问控制,所以相较sql注入要容易很多,这里用一道赛题来举例:

  通过访问/download.php?file=backup.zip下载网页源码,如下:

 1 <?php
 2 $re = array('and','or','count','select','from','union','group','by','limit','insert','where','order','alter','delete','having','max','min','avg','sum','sqrt','rand','concat','sleep');
 3   setcookie('injection','c3FsaSBpcyBub3QgdGhlIG9ubHkgd2F5IGZvciBpbmplY3Rpb24=',time()+100000);
 4  
 5 if(file_exists('t3stt3st.xml')) {
 6      $xml = simplexml_load_file('t3stt3st.xml');
 7      $user=$_GET['user'];
 8      $user=str_replace($re, ' ', $user);
 9    //  $user=str_replace("'", "&apos", $user);
10      $query="user/username[@name='".$user."']";
11      $ans = $xml->xpath($query);
12      foreach($ans as $x => $x_value)
13      {
14          echo $x.":  " . $x_value;
15          echo "<br />";
16      }
17  }

  首先看到他过滤了sql注入的一些关键字,setcookie中有一段base64加密的密文,解码后得到的是:“sqli is not the only way for injection”,根据提示sql不是唯一的注入方式,再结合下面对xml的一系列操作,可以确定这道题是用xpath注入,于是根据$query="user/username[@name='".$user."']";这一句可构造如下payload:

  

这句payload的意思是闭合了“.$user.”前后的单引号同时执行三个操作,其中第二个操作//*即是关键点,列出文档中的所有元素,最后拿到flag

  站在开发的角度来看,当存在如下user.xml文档时:

 1 <user>
 2      <firstname>Ben</firstname>
 3      <lastname>Elmore</lastname>
 4      <loginID>abc</loginID>
 5      <password>test123</password>
 6 </user>
 7 <user>
 8      <firstname>Shlomy</firstname>
 9      <lastname>Gantz</lastname>
10      <loginID>xyz</loginID>
11      <password>123test</password>
12 </user>

  xpath典型的查询语句便是:

//users/user[loginID/text()='xyz'and password/text()='123test']

  但此处存在一个xpath注入可以绕过用户验证:只需将传入的参数loginID和password的值改为' or ''='

//users/user[loginID/text()='' or ''='' and password/text()='' or ''='']

  此时,通过传入的值闭合了参数两边的单引号,又使其查询恒为真,故达到了绕过的目的

延展开来,xpath的注入还有很多花样,像是通过updataxml()函数实现xpth报错注入,还有xpth的盲注

 

 防御方法:

  1、和sql注入的防御一样,在服务器处理提交的数据前先检查数据是否包含特殊字符,对其进行过滤

  2、对系统出现的错误信息用统一的报错页面代替(如updataxml()这类)

  3、在数据的传输过程中,对敏感信息进行加密

  4、构建xpath查询表达式,以变量的形式参数化xpath查询:

//users/user[@loginID=$loginID and @password= $password]

 

 

 

参考文献:

http://www.runoob.com/xpath/xpath-syntax.html

http://blog.youkuaiyun.com/qq1175421841/article/details/50194673

http://blog.youkuaiyun.com/quiet_girl/article/details/50588130

转载于:https://www.cnblogs.com/sherlock17/p/7229267.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值