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

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

时间: 2024-10-14 04:25:32

XPath注入的相关文章

XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式

SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book.com,你点进一本书的详情页面,其url是这样的: book.com/book?id=100 说明这本书在数据库中的键值是100,后端收到url参数后就执行了数据库查询操作: select * from booktable where id='100' 那么如果我们把url更改为 book.com

看好你的门-攻击数据存储区(4)-XPath注入攻击

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1.一些多余的话 XPath注入和SQL注入,原理上非常相似 但是XPath注入的对象主要是XML,相对来说,危害性更加大 2.保存用户信息的XML <?xml version="1.0" encoding="utf-8" ?> <root> <user> <id>1</id> <username

XPath注入技术综述

一次完整的 XPath 注入攻击应该包括使用特殊构造的查询来提取一个 XML 数据库内的 数据或者信息.作为一门新的技术,XPath 注入在一定程度上和 SQL 注入漏洞有着惊人的相 似之处,通过下面的文字,我们将进一步来了解这种新型渗透技术. 在温习前人的相关研究成果之前,我们将介绍一些理论性的研究背景,这样有助于我们 更好地理解这种手法的关键.首先我们要了解的便是 XML 标准和 XPath 语言(XML 是 The Extensible Markup Language(可扩展标识语言)的简

WEB安全第五篇--其他注入的奇技淫巧:XML注入、Xpath注入、Json注入、CRLF注入

零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的payload技巧以便于备忘.不是大神.博客内容非常基础,如果真的有人看而且是大牛们,请不要喷我,欢迎指正我的错误(水平有限). 一.XML注入: 1.本质: XML是一种数据组织存储的数据结构方式,安全的XML在用户输入生成新的数据时候应该只能允许用户接受的数据,需要过滤掉一些可以改变XML标签也就是说

XPATH 注入的介绍与代码防御

0x01 介绍 软件未正确对 XML 中使用的特殊元素进行无害化处理,导致攻击者能够在终端系统处理 XML 的语法.内容或命令之前对其进行修改.在 XML 中,特殊元素可能包括保留字或字符,例如“<”.“>”.“"”和“&”,它们可能用于添加新数据或修改 XML 语法.我们发现用户可控制的输入并未由应用程序正确进行无害化处理,就在 XPath 查询中使用.例如,假定 XML 文档包含“user”名称的元素,每个元素各包含 3 个子元素 -“name”.“password”和

WebGoat教程学习(七)--XPATH 注入(XPATH-Injection)

1.除了SQL注入外还要考虑XPTH的过滤. File d = new File(dir); XPathFactory factory = XPathFactory.newInstance(); XPath xPath = factory.newXPath(); InputSource inputSource = new InputSource(new FileInputStream(d)); String expression = "/employees/employee[loginID/te

报错注入分析之updatexml注入

PS:今天元旦,家里打来电话说,今年春节要回老家.心里倍感恐惧.可以清楚的感觉得到父母说话的气息没有底气.大概如同我一样是恐惧吧.加油吧!努力赚钱! 回归正题:updatexml注入 首先了解一下什么是updatexml函数. 前言:相比基于查询的SQL注入,使用insert.update和delete进行SQL注入显得略显另类 参考自:http://www.exploit-db.com/wp-content/themes/exploit/docs/33253.pdf 0x1 准备条件 a. m

Web脚本攻击之注入攻击

注入攻击的概念和原理 注入漏洞是Web服务器中广泛存在的漏洞类型,其基本原理是Web程序对用户输入请求中包含的非法数据检查过滤不严,使Web程序将用户的异常输入字符当做正常代码执行,从而使用户在未授权的情况下非法获取Web服务器的信息. 利用注入漏洞发起的攻击称为注入攻击,它是Web安全领域最为常见威胁也是最大的攻击,注入攻击包括SQL注入.代码注入.命令注入.LDAP注入.XPath注入等.实现注入攻击要具备两个关键条件,第一是用户能够自主编写输入的数据,第二是Web程序的执行代码被拼接了用户

PHP Fuzzing行动——源码审计 黑客注入防范

PHP Fuzzing行动——源码审计 黑客注入防范 原文地址:forum.eviloctal.com/attachment.php?aid=13807 ---------- PHP Fuzzing行动——源码审计 作者:Shahin Ramezany 译者:riusksk(泉哥:http://riusksk.blogbus.com) 目录: Section 1: 20种PHP源码快速审计方式 Section 2: PHP源码审计自动化( PHP Fuzzer ) 风险级别: ■ Low ■ M