sql报错注入 之 floor 函数报错:主键重复

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

Mysql报错注入之floor报错详解

updatexml extractvalue

floor 是mysql的函数

groupby+rand+floor+count

一、简述

利用 select count(*),(floor(rand(0)*2))x from table group by x,导致数据库报错,通过 concat 函数,连接注入语句与 floor(rand(0)*2)函数,实现将注入结果与报错信息回显的注入方式。

基本的查询 select 不必多说,剩下的几个关键字有 count 、group by 、floor、rand。

二、关键函数说明

1.rand函数

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

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

可见,直接使用rand函数每次产生的数都不同,但是当提供了一个固定的随机数的种子0之后:

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

每次产生的值都是一样的。也可以称之为伪随机(产生的数据都是可预知的)。
查看多个数据看一下。(users是一个有6行数据的表)

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

这样第一次产生的随机数和第二次完全一样,也就是可以预测的。
利用的时候rand(0)*2为什么要乘以 2 呢?这就要配合 floor 函数来说了。

2.floor(rand(0)*2)函数

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

而rand() 是返回 0 到 1 之间的随机数,那么floor(rand(0))产生的数就只是0,这样就不能实现报错的:

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

而rand产生的数乘 2 后自然是返回 0 到 2 之间的随机数,再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1:

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

并且根据固定的随机数种子0,他每次产生的随机数列都是相同的0 1 1 0 1 1。

3.group by 函数

group by 主要用来对数据进行分组(相同的分为一组)。

还是按照下表进行实验

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

首先我们在查询的时候是可以使用as用其他的名字代替显示的:

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

但是在实际中可以缺省as直接查询,显示的结果是一样的:

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

然后就可以用group by函数进行分组,并按照x进行排序

注意:最后x这列中显示的每一类只有一次,前面的a的是第一次出现的id值

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

4.count(*)函数

count(*)统计结果的记录数。

这里与group by结合使用看一下:

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

这里就是对重复性的数据进行了整合,然后计数,后面的x就是每一类的数量。

5.综合使用产生报错:

select count(*),floor(rand(0)*2) x from users group by x;

0 1 1 0 1 1

0 2

1 4

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

根据前面函数,这句话就是统计后面产生随机数的种类并计算每种数量。

分别产生0 1 1 0 1 1 ,这样0是2个,1是4个,但是最后却产生了报错。

0 2

1 4

三、报错分析

这个整合然后计数的过程中,中间发生了什么我们是必须要明白的。
首先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)查询前默认会建立空虚拟表如下图:

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

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

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

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

0 1 1 0 1 1 0

0 1 1

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

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

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

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

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

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

0 1 1 0

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

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

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

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

0 1 1 0 1

四、总结

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

security1
security1
security1


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

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

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

sql报错注入 之 floor 函数报错:主键重复,sql,数据库

sql报错注入 之 floor 函数报错:主键重复,sql,数据库文章来源地址https://www.toymoban.com/news/detail-832287.html

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

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

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

相关文章

  • MSsql数据库 sql注入

    和mysql不同;每个数据库都有自己的信息总结表 四个系统数据库 master sysdatabases :所有数据库信息 name :所有数据库名 sysobjects :数据库所有对象的信息 syscolumns :字段信息 固定字段名 name 对象名 id 对象id xtype 对象类型代码 xtype=\\\'U\\\' 用户创建的表 xtype=\\\'S\\\' 系统表 model sysobjects sys

    2024年04月10日
    浏览(39)
  • 【实训04】数据库SQL注入漏洞

      下载dvwa的时候其实已经通过了,但建议全部做一下,后面的要用 git clone GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA) 注入的sql: 使用sql注入查询数据库用户名和数据库名,并将用户名和数据库名写入/data/workspace/myshixun/result2中: 注入的sql语句: 使用sql注入查询dvwa数据库

    2024年02月16日
    浏览(30)
  • 【数据库】SQL注入从0到1

    目录 前言: 1.【入门】普通查询型注入: 1.0 实验环境: 1.1进行一次普通的查询: 1.2 进行注入得到用户信息: 1.2.1 执行注入: 1.2.2 注入语句分析: 1.3 整型注入与字符型注入区别: 2.【进阶】从库到列逐步注入: 2.1 预备知识: 2.1.1 union函数: 2.1.2 order by函数: 2.1.3 infor

    2024年02月05日
    浏览(37)
  • sql server 如何设置数据库某个字段值不能重复?

    在 SQL Server 中,可以通过以下两种方式设置数据库某个字段值不能重复: 唯一约束(Unique Constraint):唯一约束是在表级别上定义的约束,用于确保某个列的值在表中是唯一的。可以通过以下 SQL 语句来创建唯一约束: 唯一索引(Unique Index):唯一索引也用于确保某个列的值

    2024年02月13日
    浏览(41)
  • 渗透测试-SQL注入之核心语法获取数据库信息

    SQL实验室第一关 下载sqli-labs到phpstudy的www目录下 打开localhost/sqli-labs运行即可 (1)注入语句 ‘~’ 相当于16进制的0x7e 万能密码 \\\'or ‘1’ =\\\'1 ’ and ‘1’=‘1 ’ and 1=2 union select 1,user(),3- -+ 前面加’是为了闭合后面的’ (2)group_concat(string) (1)SQL手工注入方法 select schema_name

    2024年02月10日
    浏览(29)
  • Python MySQL 数据库查询:选择数据、使用筛选条件、防止 SQL 注入

    要从MySQL中的表格中选择数据,请使用\\\"SELECT\\\"语句: 示例选择\\\"customers\\\"表格中的所有记录,并显示结果: 注意 :我们使用 fetchall() 方法,该方法从上次执行的语句中获取所有行。 要仅选择表格中的某些列,请使用\\\"SELECT\\\"语句,后跟列名: 示例仅选择name和address列: 如果您只对

    2024年02月05日
    浏览(71)
  • 确保你的数据库安全:如何防止SQL注入攻击

    最近,越来越多的组织和公司受到SQL注入攻击的困扰。这种攻击可以导致数据库中的敏感信息泄露,破坏数据完整性,甚至可能导致整个系统崩溃。如果您是一名数据库管理员或网站管理员,您需要了解如何保护您的数据库免受SQL注入攻击的威胁。在本文中,小德将介绍什么

    2024年02月02日
    浏览(43)
  • 五、C#与数据库交互( SQL注入与安全性)

    在C#与数据库交互时,安全性是非常重要的一部分,特别是要防止SQL注入攻击。SQL注入是一种常见的网络攻击手段,攻击者通过在输入字段中注入恶意SQL代码来操纵数据库查询。以下是一些关于如何防止SQL注入的建议: 使用参数化查询 : 这是防止SQL注入的最有效方法。参数化

    2024年02月02日
    浏览(46)
  • 记录恶意SQL注入引发的RDS只读数据库CPU飚100%

    前言 : 在广州这座城市下着小雨的晚上,我正在厨房洗着碗,突然手机有来电,脱下手套,一看是来自阿里云的告警电话。打开飞书查看告警内容,发现某个业务的RDS只读实例CPU飚到100%,下意识觉得是不是有慢查询导致,想着不会有啥问题,上去kill慢查就好了,结果发现是

    2024年03月19日
    浏览(35)
  • 网络安全进阶学习第十二课——SQL手工注入3(Access数据库)

    判断数据库类型 —— 判断表名 —— 判断列名 —— 判断列名长度 —— 查出数据。 asp的网站,常用数据库为access、sqlserver。 and exsits (select * from msysobjects)0 access and exsits (select * from sysobjects)0 sqlserver 上述语句 会返回1或者0 。 msysobjects是access的默认数据库 , sysobjects是sqlserv

    2024年02月11日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包