报错注入函数——floor、updatexml、extractvalue的浅入解析

admin 2022年6月30日01:39:34SecIN安全技术社区报错注入函数——floor、updatexml、extractvalue的浅入解析已关闭评论15 views3007字阅读10分1秒阅读模式

0x01 floor()报错注入函数浅析

floor报错注入语句:

select count(*),(floor(rand(0)*2)) x from information_schema.tables group by x;

通过concat函数连接注入语句与floor(rand(0)*2)函数,实现将注入结果与报错信息回显的注入方式。

1.1 floor()函数

floor函数的作用就是返回小于等于括号内该值的最大整数。

报错注入函数——floor、updatexml、extractvalue的浅入解析

1.2 rand()函数

rand()可以产生一个在0和1之间的随机数。

报错注入函数——floor、updatexml、extractvalue的浅入解析

直接使用rand函数每次产生的数值不一样,但当我们提供了一个固定的随机数的种子0(官方的单词是seed)之后,每次产生的值都是相同的,这也可以称之为伪随机。

报错注入函数——floor、updatexml、extractvalue的浅入解析

floor(rand(0)*2)就是对rand(0)产生的随机序列乘2后的结果,再进行取整。配合上floor函数就可以产生确定的两个数,即0和1,得到伪随机序列为如下图所示:

报错注入函数——floor、updatexml、extractvalue的浅入解析

报错注入函数——floor、updatexml、extractvalue的浅入解析

1.3 group by 与count(*)

group by 主要用来对数据进行分组(相同的分为一组),这里与count(*) 结合使用的作用就能看得出来。

报错注入函数——floor、updatexml、extractvalue的浅入解析

表中只有一条记录时,多次使用报错语句并不会报错。

报错注入函数——floor、updatexml、extractvalue的浅入解析

表中只有两条记录时,多次使用报错语句也不会报错

报错注入函数——floor、updatexml、extractvalue的浅入解析

表中有三条记录时,执行语句一定会报错

报错注入函数——floor、updatexml、extractvalue的浅入解析

由此可见floor(rand(0)*2)报错是有条件的,表中的记录必须是三条以上。
看看rand(0)和rand(1)是否有决定因素,由上面函数介绍已经知道rand(0)和rand()的区别。
rand()的时候一条记录的时候多次执行不报错

报错注入函数——floor、updatexml、extractvalue的浅入解析

两条记录的时候出现了偶尔报错

报错注入函数——floor、updatexml、extractvalue的浅入解析

三条记录的时候偶尔报错

报错注入函数——floor、updatexml、extractvalue的浅入解析

试试添加多条记录,rand(0)与rand()的区别

报错注入函数——floor、updatexml、extractvalue的浅入解析

报错注入函数——floor、updatexml、extractvalue的浅入解析

可以看到floor(rand(0)2)一定会报错,floor(rand()2)的结果是随机的。

mysql5.7官方语法文档介绍

如果指定了整数参数N,则将其用作种子值:

  1. 使用常量初始化器参数,种子在语句准备好时初始化一次,然后再执行。
  2. 使用非常量初始值设定项参数(例如列名),种子使用每次调用的值进行初始化 RAND()

在ORDER BY或GROUP BY子句中使用带有RAND()值的列可能会产生意想不到的结果,因为对于这两个子句,同一行RAND()表达式可以被求多次值,每次都返回不同的结果。问题就出在可能会产生意想不到的结果

select name,count(*) from cunmin group by name;

报错注入函数——floor、updatexml、extractvalue的浅入解析

这个图等会下面分析会用到

报错注入函数——floor、updatexml、extractvalue的浅入解析

浅析下该语句的执行过程。

select count(*) from cunmin group by floor(rand(0)*2);

1、查询前默认会建立如下空虚拟表

| key | count(*) |
| --------- | -------------- |
| | |
| | |

2、查询第一条记录,执行floor(rand(0)2),发现结果为0(第一次计算),查询虚拟表,发现0的键值不存在,则floor(rand(0)2)会被再计算一次,结果为1(第二次计算),插入虚表,这时第一条记录查询完毕,结果如下:

| key | count(*) |
| ------------------------- | -------------- |
| 1(第一次计算结果) | 1 |

3、查询第二条记录,再次计算floor(rand(0)2),发现结果为1(第三次计算),查询虚表,发现1的键值存在,所以floor(rand(0)2)不会被计算第二次,直接count(*)加1,第二条记录查询完毕,结果如下:

| key | count(*) |
| ------------------------- | -------------- |
| 1(第一次计算结果) | 2 |

4、查询第三条记录,再次计算floor(rand(0)2),发现结果为0(第4次计算),查询虚表,发现键值没有0,则数据库尝试插入一条新的数据,在插入数据时floor(rand(0)2)被再次计算,作为虚表的主键,其值为1(第5次计算),然而1这个主键已经存在于虚拟表中,而新计算的值也为1(主键键值必须唯一),所以插入的时候就直接报错了。
理解上面1、2、3、4这四段话看着上面的图更容易理解。

5、整个查询过程floor(rand(0)*2)被计算了5次,查询原数据表3次,所以这就是为什么数据表中需要3条数据,使用该语句才会报错的原因。

报错注入函数——floor、updatexml、extractvalue的浅入解析

0x02 updatexml报错注入函数

知识前提:
XPath 是一门在 XML 文档中查找信息的语言。
mysql高版本(大于5.1版本)中添加了对XML文档进行查询和修改的函数
updatexml()
extractvalue()
执行函数时,如果出现xml文档路径错误就会产生报错。

2.2 updatexml()函数

updatexml()是一个使用不同的xml标记匹配和替换xml块的函数。
作用:改变文档中符合条件的节点的值
语法: updatexml(XML_document,XPath_string,new_value)
第一个参数:是string格式,为XML文档对象的名称
第二个参数:代表路径,Xpath格式的字符串例如
第三个参数:string格式,替换查找到的符合条件的数据
updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
例子:

select updatexml(1,concat(0x7e,(SELECT DATABASE()),0x7e),1);

报错注入函数——floor、updatexml、extractvalue的浅入解析

报错注入函数——floor、updatexml、extractvalue的浅入解析

0x03 extractvalue()函数

此函数从目标XML中返回包含所查询值的字符串语法:extractvalue(XML_document,xpath_string) 第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串)
select * from
select name passwod from test。
第一条语句检索出user表的所有的列
第二条语句只检索出test表的 name和password列。
在做对所有表的检索都提倡用第二种方式,因为一个表可能有上百个字段,而我们需要的只是其中几个字段,全部检索会耗费太多的资源。尤其是开发web服务器程序时,每一时刻可能有上万次的检索要执行,两条语句在效率上差别就非常明显。

报错注入函数——floor、updatexml、extractvalue的浅入解析

0x04 总结

报错注入作为2017年的OWASP TOP10漏洞的榜首,平时做渗透测试中,注入优先级为:联合查询注入>报错注入>布尔注入>时间盲注。

参考链接:

https://wooyun.kieran.top/#!/drops/1140.Mysql%E6%8A%A5%E9%94%99%E6%B3%A8%E5%85%A5%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90(count()%E3%80%81rand()%E3%80%81group%20by

https://flyingfox.fun/2021/07/15/floor%E6%8A%A5%E9%94%99%E6%B3%A8%E5%85%A5%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/

http://www.hellomao.top/2019/08/16/web_mysql_floor/

https://bugs.mysql.com/bug.php?id=82544

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月30日01:39:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  报错注入函数——floor、updatexml、extractvalue的浅入解析 http://cn-sec.com/archives/1148834.html