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下载网页源码,如下:
<?php
$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');
setcookie('injection','c3FsaSBpcyBub3QgdGhlIG9ubHkgd2F5IGZvciBpbmplY3Rpb24=',time()+100000); if(file_exists('t3stt3st.xml')) {
$xml = simplexml_load_file('t3stt3st.xml');
$user=$_GET['user'];
$user=str_replace($re, ' ', $user);
// $user=str_replace("'", "&apos", $user);
$query="user/username[@name='".$user."']";
$ans = $xml->xpath($query);
foreach($ans as $x => $x_value)
{
echo $x.": " . $x_value;
echo "<br />";
}
}
首先看到他过滤了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文档时:
<user>
<firstname>Ben</firstname>
<lastname>Elmore</lastname>
<loginID>abc</loginID>
<password>test123</password>
</user>
<user>
<firstname>Shlomy</firstname>
<lastname>Gantz</lastname>
<loginID>xyz</loginID>
<password>123test</password>
</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.csdn.net/qq1175421841/article/details/50194673
http://blog.csdn.net/quiet_girl/article/details/50588130
Xpath注入学习的更多相关文章
- xpath注入详解
0x01 什么是xpath XPath 即为 XML 路径语言,是 W3C XSLT 标准的主要元素,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言. XPath 基于 ...
- MySQL手工注入学习-1
MySQL手工注入学习 SQLi-labs 手工注入学习 以下是通过SLQi-labs平台的部分简单例题的手工注入过程 Less-1:union联合查询注入 页面提示:Please input the ...
- XPath注入
XPath基础 XPath 即为 XML 路径语言,是一门在XML文档中查找信息的语言.XPath 基于 XML 的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻 ...
- XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式
SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...
- 【转】XPath的学习
xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker 定位 1.依靠自己属性,文本定位 //td[ ...
- XPath注入笔记
XPath注入 XQuery注入 测试语句:'or '1'='1 利用工具: Xcat介绍 Xcat是python的命令行程序利用Xpath的注入漏洞在Web应用中检索XML文档 下载地址:https ...
- 跟bWAPP学WEB安全(PHP代码)--XPath注入
XML/Xpath注入 看了下,A2里面是认证与会话管理的破坏或称之为绕过,没有特别要写的,很多就是小问题,可能会将这类问题放在最后写一下.一篇博客,这里还是更多的着重在能够获取信息或者服务器权限的漏 ...
- WEB安全第五篇--其他注入的奇技淫巧:XML注入、Xpath注入、Json注入、CRLF注入
零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...
- xpath的学习
xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker 定位 1.依靠自己属性,文本定位 //td[ ...
随机推荐
- Maven可以提交到官方公共仓库maven.org
参考http://central.sonatype.org/pages/ossrh-guide.html这个网址的操作,即可提交到maven.org. 这里有具体的实践方法:http://blog.c ...
- C# 获取config文件的值
自定义配置文件帮助类 利用ExeConfigurationFileMap类将自定义配置文件转换为Configuration类进行数据读取 代码很简单,就不做扼要说明 /// <summary&g ...
- bootstrap 报错
1. bootstrap table 加载出错,前台报错 Cannot read property 'colspan' of undefined { title : '设备类型', field : ' ...
- mybatis 小结
1. 根据后台list 在SQL中使用到In的时候 <if test="sbidList != null and sbidList.size() > 0"> A ...
- [日常] nginx与HTTP cache
去年的事,随便记记 =============================================================2017年12月11日 记录: nginx缓存:ngx_h ...
- MySQL3:存储过程和函数
什么是存储过程 简单说,存储过程就是一条或多条SQL语句的集合,可视为批文件,但是起作用不仅限于批处理.本文主要讲解如何创建存储过程和存储函数以及变量的使用,如何调用.查看.修改.删除存储过程和存储函 ...
- MyBatis中的条件查询(动态sql)
本文将介绍使用MyBatis框架,编写DAO层接口类和接口类对应的sql映射文件,使用动态sql查询满足条件的用户集合. 首先,需要创建一个实体类User,供封装数据使用: package com.x ...
- mysql,存储引擎,事务,锁,慢查询,执行计划分析,sql优化
基础篇:MySql架构与存储引擎 逻辑架构图: 连接层: mysql启动后(可以把mysql类比为一个后台的服务器),等待客户端请求,当请求到来后,mysql建立一个一个线程处理(线程池则分配一个空线 ...
- idea 版本升级至最新版
前言:当前最新版为官网上的2018.2.3版本 一.下载最新版 官网地址:http://www.jetbrains.com/idea/download/#section=windows 百度网盘地址: ...
- Python rest-framework 中类的继承关系(as_view)
一. 背景 最近几天一直在学习restful framework的源代码,用户请求的流程,在路由系统这块遇到一个疑问,关于类的继承关系,当请求进来到路由这块,执行as_view()方法的时候,为什么会 ...