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 元素,且这些元素拥有值为 1dig 属性。

/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的密码:

 

 

 

原文地址:https://www.cnblogs.com/endust/p/11831729.html