前置知识
Xpath简介
Xpath(XML Path language),即为XML路径语言,使用在XML文档中查找信息的语言。XPath 基于 XML 的树状结构(如下),有不同类型的节点,包括元素节点,属性节点和文本节点,Xpath提供在数据结构树中找寻节点的能力,可用来在 XML 文档中对元素和属性进行遍历,通过路径表达式选择和操作XML文档节点。
简而言之,XPath语言就是XML中用于定位查询的语言。
重温XML语言
只是做个简单基础回顾,细节处可能诠释得不太好。关于xml语言,其中包含一个重要的概念:节点。可以说xml文档是由各种节点组成,常见节点包括:元素节点、属性节点、文本节点、注释节点、、子孙节点
以下述得xml文档为例
<?xml version="1.0" encoding="ISO-8859-1"?> //XML 声明
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>JK.Rowling</author>
<year>2005</year><!-- Text Node -->
<price>29.99</price>
</book>
</bookstore>
根元素节点:<bookstore>
<bookstore>的子元素节点:<book>
<book>的子元素节点:<title>、<author>、<year>、<price>
<bookstore>的子孙节点:<book>、<title>、<author>、<year>、<price>
属性节点:lang="en"
文本节点:JK.Rowling、2005、29.99
注释节点:<!-- Text Node -->
XPath基础语法
1、节点选取
下述表格的小括号中的,就是根据上述xml文档举的例子
表达式&示例 | 描述&示例结果 |
---|---|
nodename(bookstore) | 选取此节点的所有子节点。(<book>) |
/ | 从根节点选取子节点。 |
/xxx/xxx(/bookstore/book) | 从指定的绝对路径节点选取子节点(<title>、<author>……) |
//(//book) | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。 |
. | 选取当前节点。 |
..(//book/..) | 选取当前节点的父节点。(bookstore的子孙节点) |
@(//@lang) | 选取属性节点。(lang="en") |
text()(//year/test()) | 选取文本节点。(2005) |
2、谓语
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]//title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
3、选取未知节点
通配符 | 描述 |
---|---|
(/bookstore/) | 匹配任何元素节点。(bookstore的所有子元素) |
@(//@) | 匹配任何属性节点。(选取所有属性节点) |
node()(//node()) | 匹配任何类型的节点。(选取所有类型节点) |
4、轴
轴可定义相对于当前节点的节点集,常用使用的形式: 轴::node() 。由于形式几乎一致,就只举下述表格中一个例子即可。
轴名称 | 结果 |
---|---|
ancestor(//book/ancestor::node()) | 选取当前节点的所有先辈(父、祖父等)。(bookstore) |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
attribute | 选取当前节点的所有属性。 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
…….. | ……. |
5、运算符
运算符同sql注入的差不多,加减等于就不用怎么看了,主要是学习运算符如何拼接语句,让我们能看懂并且会写一些payload
| |(//book|//bookstore) | 计算两个节点的并集子节点(返回book和bookstore的所有子节点) | | --- | --- | | or(' or '1'='1) | 或者(可以使得最终判定结果为ture) |
等等等知识点,只列举一些基础的,能让我们知道怎么写和看懂payload即可。
Xpath注入
描述
XPath注入攻击,是指利用XPath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。XPath注入攻击是针对Web服务应用新的攻击方法,它允许攻击者在事先不知道XPath查询相关知 识的情况下,通过XPath查询得到一个XML文档的完整内容或相关XML型数据库(Oracle XML DB、Microsoft SQL Server(XML 数据存储))的内容。
简而言之,Xpath注入攻击本质上和SQL注入攻击是类似的,都是输入一些恶意的查询等代码字符串,从而对网站进行攻击。
注入原理&展示示例
XPath注入攻击主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行XPath查询而执行入侵者想要的操作,但是,注入的对象不是数据库users表了,而是一个存储数据的XML文件。攻击者可以获取 XML 数据的组织结构,或者访问在正常情况下不允许访问的数据,如果 XML 数据被用于用户认证,那么攻击者就可以提升他的权限。因为