xPath注入的基础语法有哪些

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

xPath中包含七种类型的节点: 元素、属性、文本、命名空间、处理指令、注释及文档根节点。xml文档是按照文档树的结构进行解析的,文档树的根被称为文档节点或根节点。

xPath注入基础语法全解析

这是一份基本的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元素节点的先辈就是book、bookstore。

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

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

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代码)

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

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

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

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

先列出需要查询的语法:

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

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

/bookstore:选取根元素 bookstore。

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

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

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

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

只使用这些单一查询可能无法得到预期结果,需要将它们与其他查询语句进行组合。以下是需要配合的一些语法:

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

选取 bookstore 元素的第一个子元素 book 的路径为 /bookstore/book[1]。

/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

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

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



xPath是一种用于选取XML文档中特定部分的语言,它经常被用于爬虫、数据采集和数据挖掘等领域。但是,如果web应用程序没有对xPath注入进行适当的验证和过滤,攻击者就可以通过在输入框中注入xPath语句,从而获取权限和执行任意代码。本文将对xPath注入基础语法进行深入探讨。
第一章:基本语法解析
xPath注入与SQL注入非常类似,也是通过在输入框中输入可执行的xPath语句,从而获取所需信息和权限。攻击者通常会将xPath注入的语句放在输入框的参数中,例如:
/product?item=123]//*[text()='Administrator']|id('foo') or 1=1]/@*
这个语句将会在指定的XML文档中查找元素名称为“Administrator”的所有节点,并将得到的结果返回给攻击者。攻击者还可以使用逻辑运算符、通配符和函数等高级特性,构造出更为复杂的xPath注入语句来执行攻击。
第二章:实战案例演示
下面我们使用一个简单的实战案例来演示xPath注入的具体操作过程。假设有一个网站,其URL为:
http://www.example.com/login?username=xx&password=xx
通过测试,我们发现该网站存在xPath注入漏洞。为了获取管理员账号和密码,我们可以在username和password参数中输入以下语句:
admin' or 1=1]/password/text()='123456
这个语句将会将username参数设置为“admin' or 1=1]”,并将password参数设置为“password/text()='123456'”,从而绕过了登陆验证,并获取了管理员账号和密码。
第三章:防范措施
在开发过程中,应该加强对用户输入参数的验证和过滤,避免xPath注入漏洞的产生。下面是一些防范xPath注入的措施:
1.对用户输入的参数进行合理性检验,如长度、格式等。
2.过滤参数中的特殊字符,例如单引号、双引号、分号等。
3.使用参数化查询代替字符串拼接的方式,避免注入攻击。
4.使用开源的xPath注入检测工具进行测试,如sqlmap、xcat等。
总结:
xPath注入是一种十分危险的web漏洞,与SQL注入类似,它也可以被用于获取敏感信息、窃取用户密码、注入恶意代码等。在web应用程序的开发和测试过程中,我们应该始终保持警惕,加强对xPath注入漏洞的检测和预防。同时,也应该充分了解攻击者的xPath注入技巧和攻击手段,以便更好地保护自己的网站和应用程序。