freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试 | 一文学习Xpath注入
2024-09-11 01:14:42

前置知识

Xpath简介

Xpath(XML Path language),即为XML路径语言,使用在XML文档中查找信息的语言。XPath 基于 XML 的树状结构(如下),有不同类型的节点,包括元素节点,属性节点和文本节点,Xpath提供在数据结构树中找寻节点的能力,可用来在 XML 文档中对元素和属性进行遍历,通过路径表达式选择和操作XML文档节点。

2114266969.gif

简而言之,XPath语言就是XML中用于定位查询的语言。

重温XML语言

只是做个简单基础回顾,细节处可能诠释得不太好。关于xml语言,其中包含一个重要的概念:节点。可以说xml文档是由各种节点组成,常见节点包括:元素节点、属性节点、文本节点、注释节点、、子孙节点

以下述得xml文档为例

<?xml version="1.0" encoding="ISO-8859-1"?>  //XML 声明

<bookstore>     
<book>          
  <title lang="en">Harry Potter</title>  
  <author>JK.Rowling</author>      
  <year>2005</year><!-- Text Node --> 
  <price>29.99</price>
</book>
</bookstore>

根元素节点:<bookstore>
	<bookstore>的子元素节点:<book>
		<book>的子元素节点:<title>、<author>、<year>、<price>
<bookstore>的子孙节点:<book>、<title>、<author>、<year>、<price>
属性节点:lang="en"
文本节点:JK.Rowling、2005、29.99
注释节点:<!-- Text Node --> 

XPath基础语法

1、节点选取

下述表格的小括号中的,就是根据上述xml文档举的例子

表达式&示例描述&示例结果
nodename(bookstore)选取此节点的所有子节点。(<book>)
/从根节点选取子节点。
/xxx/xxx(/bookstore/book)从指定的绝对路径节点选取子节点(<title>、<author>……)
//(//book)从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。
.选取当前节点。
..(//book/..)选取当前节点的父节点。(bookstore的子孙节点)
@(//@lang)选取属性节点。(lang="en")
text()(//year/test())选取文本节点。(2005)

2、谓语

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/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。

3、选取未知节点

通配符描述
(/bookstore/)匹配任何元素节点。(bookstore的所有子元素)
@(//@)匹配任何属性节点。(选取所有属性节点)
node()(//node())匹配任何类型的节点。(选取所有类型节点)

4、轴

轴可定义相对于当前节点的节点集,常用使用的形式: 轴::node() 。由于形式几乎一致,就只举下述表格中一个例子即可。

轴名称结果
ancestor(//book/ancestor::node())选取当前节点的所有先辈(父、祖父等)。(bookstore)
ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute选取当前节点的所有属性。
child选取当前节点的所有子元素。
descendant选取当前节点的所有后代元素(子、孙等)。
……..…….

5、运算符

运算符同sql注入的差不多,加减等于就不用怎么看了,主要是学习运算符如何拼接语句,让我们能看懂并且会写一些payload

| |(//book|//bookstore) | 计算两个节点的并集子节点(返回book和bookstore的所有子节点) | | --- | --- | | or(' or '1'='1) | 或者(可以使得最终判定结果为ture) |

等等等知识点,只列举一些基础的,能让我们知道怎么写和看懂payload即可。

Xpath注入

描述

XPath注入攻击,是指利用XPath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。XPath注入攻击是针对Web服务应用新的攻击方法,它允许攻击者在事先不知道XPath查询相关知 识的情况下,通过XPath查询得到一个XML文档的完整内容或相关XML型数据库(Oracle XML DB、Microsoft SQL Server(XML 数据存储))的内容。

简而言之,Xpath注入攻击本质上和SQL注入攻击是类似的,都是输入一些恶意的查询等代码字符串,从而对网站进行攻击。

注入原理&展示示例

XPath注入攻击主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行XPath查询而执行入侵者想要的操作,但是,注入的对象不是数据库users表了,而是一个存储数据的XML文件。攻击者可以获取 XML 数据的组织结构,或者访问在正常情况下不允许访问的数据,如果 XML 数据被用于用户认证,那么攻击者就可以提升他的权限。因为

# web安全 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录