XPath注入
作者:互联网
XPath基础
XPath 即为 XML 路径语言,是一门在XML文档中查找信息的语言。XPath 基于 XML 的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力,可用来在 XML 文档中对元素和属性进行遍历。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
XPath节点
XPath中有七种节点类型:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。文档的根节点即是文档结点;对应属性有属性结点,元素有元素结点。
- element (元素)
- attribute (属性)
- text (文本)
- namespace (命名空间)
- processing-instruction (处理指令)
- comment (注释)
- root (根节点)
节点关系
节点关系分为以下5类:
- 父(Parent):每个元素以及属性都有一个父。
- 子(Children):元素节点可有零个、一个或多个子。
- 同胞(Sibling):拥有相同的父的节点。
- 先辈(Ancestor):某节点的父、父的父,等等。
- 后代(Descendant):某个节点的子,子的子,等等。
XPath 语法
以bWAPP中的heroes.xml文件为例来说明可能会更好:
<?xml version="1.0" encoding="UTF-8"?> <heroes> <hero> <id>1</id> <login>neo</login> <password>trinity</password> <secret>Oh why didn't I took that BLACK pill?</secret> <movie>The Matrix</movie> <genre>action sci-fi</genre> </hero> <hero> <id>2</id> <login>alice</login> <password>loveZombies</password> <secret>There's a cure!</secret> <movie>Resident Evil</movie> <genre>action horror sci-fi</genre> </hero> </heroes>
采取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:
表达式 |
描述 |
nodename |
选取此节点的所有子节点。 |
/ |
从根节点选取。 |
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. |
选取当前节点。 |
.. |
选取当前节点的父节点。 |
@ |
选取属性。 |
可以通过XPath在线测试工具来学习。
输入/heroes 可以获取到根节点下所有子节点。
注意:如果 XPath 的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。
谓语(Predicates)
- 谓语用来查找某个特定的节点或者包含某个指定的值的节点。
- 谓语被嵌在方括号中。
/heroes/hero[1] |
选取属于 heroes子元素的第一个 hero 元素。 |
/heroes/hero[last()] |
选取属于 heroes 子元素的最后一个 hero元素。 |
/heroes/hero[last()-1] |
选取属于 heroes 子元素的倒数第二个 hero元素。 |
/heroes/hero[position()=1] |
选取属于 heroes子元素的第一个 hero 元素。 |
/webinfo//site[@dig] |
选取所有拥有名为 dig的属性的 site 元素。 |
/webinfo//site[@dig=1] |
选取所有 site 元素,且这些元素拥有值为 1 的 dig 属性。 |
/bookstore/book[price>35.00] |
选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title |
选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
输入/heroes/hero[login='alice'],匹配login等于alice的
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 |
描述 |
* |
匹配任何元素节点。 |
@* |
匹配任何属性节点。 |
node() |
匹配任何类型的节点。 |
选取若干路径
通过在路径表达式中使用"|"运算符,您可以选取若干个路径。
XPath 轴(Axes)
轴可定义相对于当前节点的节点集。
轴名称 |
结果 |
ancestor |
选取当前节点的所有先辈(父、祖父等)。 |
ancestor-or-self |
选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
attribute |
选取当前节点的所有属性。 |
child |
选取当前节点的所有子元素。 |
descendant |
选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self |
选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following |
选取文档中当前节点的结束标签之后的所有节点。 |
namespace |
选取当前节点的所有命名空间节点。 |
parent |
选取当前节点的父节点。 |
preceding |
选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling |
选取当前节点之前的所有同级节点。 |
self |
选取当前节点。 |
XPath 运算符
运算符 |
描述 |
实例 |
返回值 |
| |
计算两个节点集 |
//book | //cd |
返回所有拥有 book 和 cd 元素的节点集 |
+ |
加法 |
6 + 4 |
10 |
- |
减法 |
6 - 4 |
2 |
* |
乘法 |
6 * 4 |
24 |
div |
除法 |
8 div 4 |
2 |
= |
等于 |
price=9.80 |
如果 price 是 9.80,则返回 true。 如果 price 是 9.90,则返回 false。 |
!= |
不等于 |
price!=9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.80,则返回 false。 |
< |
小于 |
price<9.80 |
如果 price 是 9.00,则返回 true。 如果 price 是 9.90,则返回 false。 |
<= |
小于或等于 |
price<=9.80 |
如果 price 是 9.00,则返回 true。 如果 price 是 9.90,则返回 false。 |
> |
大于 |
price>9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.80,则返回 false。 |
>= |
大于或等于 |
price>=9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.70,则返回 false。 |
or |
或 |
price=9.80 or price=9.70 |
如果 price 是 9.80,则返回 true。 如果 price 是 9.50,则返回 false。 |
and |
与 |
price>9.00 and price<9.90 |
如果 price 是 9.80,则返回 true。 如果 price 是 8.50,则返回 false。 |
mod |
计算除法的余数 |
5 mod 2 |
1 |
bWAPP源码分析
if(isset($_REQUEST["login"]) & isset($_REQUEST["password"])) { $login = $_REQUEST["login"]; $login = xmli($login); $password = $_REQUEST["password"]; $password = xmli($password); $xml = simplexml_load_file("passwords/heroes.xml"); $result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']"); if($result) { $message = "<p>Welcome <b>" . ucwords($result[0]->login) . "</b>, how are you today?</p><p>Your secret: <b>" . $result[0]->secret . "</b></p>"; } else { $message = "<font color=\"red\">Invalid credentials!</font>"; }
因此以下就是它的xpath查询语句:
/heroes/hero[login='' and password='']
Xpath注入应用
登录万能用户名/密码
以bWAPP为例,输入' or 1=1 or ''='就可以:
/heroes/hero[login='' or 1=1 or ''='' and password='']
XPath盲注
盲注主要利用XPath的一些字符串操作函数和运算符:
Xpath查询语句:
//hero[contains(genre, '')]/movie
获取ID为1的用户名:
')][id=1]/login|a[contains(aa,'
获取ID为1的密码:
标签:XPath,price,元素,选取,heroes,节点,注入 来源: https://www.cnblogs.com/endust/p/11831729.html