freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

xPath注入学习之基础语法学习
水木逸轩 2019-08-13 17:17:45 296604

首先什么是xPathxPath是一种在xml查找信息的语言

在xPath中,有七种元素的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根节点)。xml文档被当作文档树来解析,树的根被称为文档节点或者根节点。

image.png

这是一份基本的xml文档的源码,从这份xml源码中可以看出,bookstore为文档节点(根节点),book、title、author、year、price是元素节点。其中book节点拥有四个子元素节点:title、author、year、price,title节点有三个同胞:author、year、price。title这个元素节点拥有一个属性和文本节点,属性节点是lang,值为en,文本节点的值是HarryPotter。

下面还有一些xml节点关系的描述(类似于数据结构中的树):

父:book节点的父为bookstore,book节点是title、author、year、price节点的父。(每个节点只能有一个父)。

子:book是bookstore的子,book节点的子是title、author、year、price的子。

(元素节点可以有零个、一个或者多个子)。

同胞:拥有相同父的节点,类似于树结构的兄弟节点,title的同胞是author、year、price。(节点可以有零个、一个或者多个同胞)。

先辈:节点的父、父的父、父的父的父(无限循环),title元素节点的先辈就是book、bookstore。

后代:节点的子、子的子、子的子的子(无线循环),bookstore文档节点的后代就是book、title、author、year、price、lang。

知道了xml的节点关系还不够,还需要知道它是如何进行查询的,xPath通过路径表达式来选取文档中的节点或者节点集。节点是沿着路径或者步来选取的。

image.png

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:

nodename:选取此节点的所有接待你

/:从根节点选取

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

.:选取当前节点

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

@:选取属性

下面直接来通过js使用xpath查询语法来进行查询

首先写一份关于xpath调用的html(调用的代码写到js中)文件模板,然后准备好一份xml文件用来查询。

js模板的源代码如下:

https://www.runoob.com/try/try.php?filename=try_xpath_select_cdnodes

挨个看一下这份html文件中的js代码(因为只有js代码)

image.png

这是js的一个异步调用函数,重要的代码在第15行和第17行,第15行由函数传入的dname函数是xml的路径,第17行返回得到的xml文件。

image.png

再看第20行,xml变量获得loadXMLDOC函数执行得到的xml文件。21行path变量为xpath的查询语法。第一个if语句,判断是否是IE6及以下浏览器,如果是IE6或以下浏览器,获得对应的查询的到的节点数组之后,将数组中的值遍历输出到页面中。

image.png

第二个if语句对于非IE6及以下浏览器,执行的过程一样,只是语法稍有不同,非IE6及以下浏览器通过evaluate函数进行查询,格式基本固定,实践一下刚才的几个语法。

查询语法的替换只需要修改path的值就行。

image.png

先列出需要查询的语法:

注:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore:选取 bookstore 元素的所有子节点。

/bookstore:选取根元素 bookstore。

bookstore/book:选取属于 bookstore 的子元素的所有 book 元素。

//book:选取所有 book 子元素,而不管它们在文档中的位置。

bookstore//book:选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore:之下的什么位置。

//@lang:选取名为 lang 的所有属性。

但是只有这些单个的查询有的还不能得到想要的查询结果,需要将它们还有其他的查询语法组合起来才可以。以下是需要配合的一些语法:

谓语(用方括号,为了得到更精确的查询结果):

/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。

选取未知节点:

*:匹配任何元素节点。

@*:匹配任何属性节点。

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

例如:

/bookstore/*:选取 bookstore 元素的所有子元素。

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

//title[@*]:选取所有带有属性的 title 元素。

选取若干路径:

//book/title | //book/price:选取 book 元素的所有 title 和price 元素。

//title | //price:选取文档中的所有 title 和 price 元素。

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

看几个查询的例子:

查询第二个book的title值:/bookstore/book[1]/title

image.png

查询所有book的title的值:/bookstore/book//title

image.png

查询所有带lang属性的title的值:/bookstore/book//title[@lang]


 image.png


# web安全 # xpath注入
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 水木逸轩 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
油猫饼战队
渗透测试
水木逸轩 LV.2
这家伙太懒了,还未填写个人描述!
  • 14 文章数
  • 21 关注者
浅析反序列化POC
2020-09-18
Corba DEMO流量分析
2020-09-09
从CVE-2018-2628POC看T3反序列化
2020-08-28