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典型的查询语句便是:

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

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

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

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

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

 防御方法:

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

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

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

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

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

参考文献:

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

http://blog.csdn.net/qq1175421841/article/details/50194673

http://blog.csdn.net/quiet_girl/article/details/50588130

Xpath注入学习的更多相关文章

  1. xpath注入详解

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

  2. MySQL手工注入学习-1

    MySQL手工注入学习 SQLi-labs 手工注入学习 以下是通过SLQi-labs平台的部分简单例题的手工注入过程 Less-1:union联合查询注入 页面提示:Please input the ...

  3. XPath注入

    XPath基础 XPath 即为 XML 路径语言,是一门在XML文档中查找信息的语言.XPath 基于 XML 的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻 ...

  4. XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式

    SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...

  5. 【转】XPath的学习

    xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker   定位 1.依靠自己属性,文本定位 //td[ ...

  6. XPath注入笔记

    XPath注入 XQuery注入 测试语句:'or '1'='1 利用工具: Xcat介绍 Xcat是python的命令行程序利用Xpath的注入漏洞在Web应用中检索XML文档 下载地址:https ...

  7. 跟bWAPP学WEB安全(PHP代码)--XPath注入

    XML/Xpath注入 看了下,A2里面是认证与会话管理的破坏或称之为绕过,没有特别要写的,很多就是小问题,可能会将这类问题放在最后写一下.一篇博客,这里还是更多的着重在能够获取信息或者服务器权限的漏 ...

  8. WEB安全第五篇--其他注入的奇技淫巧:XML注入、Xpath注入、Json注入、CRLF注入

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  9. xpath的学习

    xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker   定位 1.依靠自己属性,文本定位 //td[ ...

随机推荐

  1. CentOS 7 安装 RabbitMQ 3.7

    目录 CentOS 7 安装 RabbitMQ 3.7 安装Erlang 安装依赖 创建yum源 参考 添加内容 安装 进入erlang命令行表示成功 安装 socat RabbitMQ 安装 sys ...

  2. TCP/IP协议栈概述及各层包头分析

    TCP/IP协议栈中各层包头的分析 Protocol列表示的是该数据包最高层对应的协议,Length列表示该包的长度(包括从底层的协议到最高层的协议,其中包头一般是,链路层14字节,IP20字节,TC ...

  3. RabbitMQ上手记录–part 4-节点集群(单机多节点)

    现在互联网应用动不动就说要HA,好像不搞个HA都不好意思说自己的应用能承载高并发,大用户量访问.RabbitMQ这个经典的消息组件,也必然逃不掉单点失效的尴尬局面.当然在RabbitMQ在被广泛应用于 ...

  4. Linux 目录流管理

    目录 1. 打开/关闭文件 1). 打开目录 / opendir 2). 关闭文件 / fclose 2. 读/写目录流 1). 目录流-读 / readdir & readdir_r 3. ...

  5. 求两个Linux文本文件的交集、差集、并集

    一.交集 sort a.txt b.txt | uniq -d 二.并集 sort a.txt b.txt | uniq 三.差集 a.txt-b.txt: sort a.txt b.txt b.tx ...

  6. [磁盘空间]lsof处理文件恢复、句柄以及空间释放问题

    曾经在生产上遇到过一个df 和 du出现的结果不一致的问题,为了排查到底是哪个进程占用了文件句柄,导致空间未释放,首先在linux上面,一切皆文件,这个问题可以使用lsof这个BT的命令来处理(这个哈 ...

  7. bootstrap栅格系统的属性及使用

    栅格系统 媒体查询 在栅格系统中,我们在 Less 文件中使用以下媒体查询(media query)来创建关键的分界点阈值. 小屏幕(平板,大于等于 768px) @media (min-width: ...

  8. 线程7--GCD的基本使用

    子线程执行延时操作,执行完成后返回主线程更新界面 dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DE ...

  9. HTML杂项和HTML废弃标签

    一.HTML杂项 1.HTML注释  <!-- 里边放要注释的文字 --> 1)html的注释是为了方便后期的维护,方便后期更改时能够快速的定位到所需更改的部分 2)html的注释在页面的 ...

  10. Linux下socket通信和多线程

    服务端socket流程:socket() –> bind() –> listen() –> accept() –> 读取.发送信息(recv,send等) 客户端socket流 ...