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[ ...
随机推荐
- puts,p,print的区别
共同点:都是用来屏幕输出的. 不同点: puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号):另外如果内容参数中有转义符,输出时将先处理转义再输出 p 基本与puts相同,但不会 ...
- Beta阶段——Scrum 冲刺博客第二天
一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 实现对index界面的重新制作,变成了原来的main界面,直接在该界面输入 ...
- Uploadify火狐出现302错误
$(function () { var auth = "@(Request.Cookies[FormsAuthentication.FormsCookieName] == null ? st ...
- SpringBoot数据库访问(一)--------关系型数据库访问(RDBMS)
关系型数据库访问(RDBMS) 采用JdbcTemplate.MyBatis.JPA.Hibernate等技术. 一.JdbcTemplate工具 在pom.xml添加boot-starter-jdb ...
- UIWebView 展示GIF/image
代码: [web loadData:self.gifDataArr[index] MIMEType:@"image/gif" textEncodingName:@"&qu ...
- Springboot集成SpringData JPA
序 StringData JPA 是微服务框架下一款ORM框架,在微服务体系架构下,数据持久化框架,主要为SpringData JPA及Mybatis两种,这两者的具体比较,本文不做阐述,本文只简单阐 ...
- PCA vs Linear Regression 可视化理解
https://shankarmsy.github.io/posts/pca-vs-lr.html https://shapeofdata.wordpress.com/2013/04/09/princ ...
- 开包即食的教程带你浅尝最新开源的C# Web引擎Blazor
在今年年初,恰逢新春佳节临近的时候.微软给全球的C#开发者们,着实的送上了一分惊喜.微软正式开源Blazor,将.NET带回到浏览器. 这个小惊喜,迅速的在dotnet开发者中间传开了.201 ...
- JSP学习笔记(4)-Javabean
按照sun公司的定义,Javabean是一个可重复使用的软件组件,实际上Javabean是一种Java类,通过封装属性和方法成为具有某种功能或处理某个业务的对象,简称Bean,Javabean基于ja ...
- LeetCode Tries Prefix Tree
class TrieNode { public: ; TrieNode* child[NR_FANOUT]; int count; // Initialize your data structure ...