zoukankan      html  css  js  c++  java
  • 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的密码:

     

     

     

  • 相关阅读:
    【病毒分析】21766239b79ece18b15a03f4517f3be6ed9c07ed
    csu1079
    数组栈coj 1019
    csu1007
    快速排序
    两大数相加
    csu1212 快排
    csu1215
    如何在IIS6,7中部署ASP.NET网站
    webpack快速入门——CSS进阶:自动处理CSS3前缀
  • 原文地址:https://www.cnblogs.com/endust/p/11831729.html
Copyright © 2011-2022 走看看