报错需要count(*),rand()、group by,三者缺一不可

前提:当行数大于等于3行时才会报错。

原链接:https://www.cnblogs.com/xdans/p/5412468.html

几个fool()原理解释:

select

count(*),floor(rand(0)*2) from test group by floor(rand(0)*2)

首先看经典的floor注入语句:

and select 1 from (select

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

group by x)a)

第一眼看起来有些懵逼,我们来从最基本的入手,最后在分析这个语句

首先是floor()报错产生的条件:

select count(*)

,floor(rand(0)*2)x from security.users group by x(自定义数据库的一张表)

这里解释一下x是什么意思,可能有些同学不太熟悉sql语句,floor(rand(0)*2)x的x是为floor(rand(0)*2)添加了一个别名,就是x就等于floor(rand(0)*2),这样做的目的是

让group by 和 floor(rand(0)*2)相遇(请原谅我这么解释),

下一步我们在报错位置处加上我们想要的子查询,用concat()拼接:

select count(*)

,concat(database(),floor(rand(0)*2))x from security.users group by x

security就是我们想要的数据库名,1是上一步拼接的。

但现在是不是就可以直接使用了呢?还有几个步骤,先看直接拼接到and 后会怎样:

select * from security.users

where id=1 and (select count(*) ,concat(database(),floor(rand(0)*2)x) from

security.users group by x)

报了一个错,百度一番发现引发这个错误的原因很多,这里我是觉得我们构建的select语句的结果是一个结果表,而and 需要一个布尔值,也就是0或非零的值,那我们在嵌套一个查询,前面说了select 的结果是一个结果表,那我们就可再从这个表执行查询,只不过这次select的值是非零数字:

select 1 from (select

count(*) ,concat(database(),floor(rand(0)*2))x from security.users group by x)a

再啰嗦一句,最后这个a和之前解释的x的作用是一样的,是前面括号内容的别名,

sql语句要求在查询结果的基础上再执行查询时,必须给定一个别名。

嵌套进and后执行

select * from security.users

where id=1 and(select 1 from (select count(*)

,concat(database(),floor(rand(0)*2))x from security.users group by x)a)

大功告成

我们完成了刚开始引入的floo()注入语句

一 随机因子具有决定权(rand()和rand(0))

随机因子指的是rand(x)

x是否有。

当插入一条记录时,不报错。

增加一条记录,有时候报错。

再增加一条记录也和2条记录一样进行随机报错。

三条及以上和2条记录一样进行随机报错。

分别对floor(rand()*2)和floor(rand(0)*2)在多记录表中执行多次(记录选择10条以上),在有12条记录表中执行结果如下图:

连续3次查询,毫无规则,接下来看看select floor(rand(0)*2) from T-Safe;,如下图:

可以看到floor(rand(0)*2)是有规律的,而且是固定的。

二 count与group by的虚拟表

在使用还有count() 和group by 的查询语句时,mysql在遇到select count(*) from TSafe group by x;这语句的时候到底做了哪些操作呢,我们果断猜测mysql遇到该语句时会建立一个虚拟表(实际上就是会建立虚拟表),那整个工作流程就会如下图所示:

1.先建立虚拟表,如下图(其中key是主键,不可重复):

2.开始查询数据,取数据库数据,然后查看虚拟表存在不,不存在则插入新记录,存在则count(*)字段直接加1,如下图:

由此看到 如果key存在的话就+1, 不存在的话就新建一个key。

三 floor(rand(0)*2)报错

1.查询的时候如果使用rand()的话,该值会被计算多次,就是在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次,以此类推。

注:使用group by,即虚表存储是按照group by 计算的那一列来从上往下来计算,取一条记录判断虚表是否存在时会使函数执行一遍,当存入的时候(即表中key值无此值)会将原函数存入,但是存的内容是最终结果,即原函数会被再次执行结果存入虚表,当表中有此键值对,那么只需count+1,不用再存key,所以比较时会计算一次,存入时又会计算一次。

2.在使用count(*)时,如

select count(*) from test group by x;  x=floor(rand(0)*2)

mysql执行此句时会创建一个虚表,虚表一共两个字段主键是x,另外一个字段是count(*)

3.首先知道floor(rand(0)*2)的值为011011...,

4.执行的过程(floor(rand(0)*2)报错的原因):(插入之前是表面显示数据,实际比较时和存储时为表面数据计算之后的结果,这取决于数据库的一种存储机制,表面的sql语句会被审查,然后执行存入数据库,再回显数据库中存的内容,即结果)

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

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

(这个位置的floor(..))有没有无所谓用不到

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

2).开始执行,查询第一条记录(即数据),在使用group by时 floor(rand(0)*2)执行一次,结果为0,即x=0(第一次执行),然后发现虚表中没有key=0的键值对记录,则floor(rand(0)*2)会被存入虚表,存入时会被计算为实际的值,即会被再执行一次(第二次执行),结果为1插入虚表,同时count由0变1。

3)取第二条记录,floor(rand(0)*2)执行一次,结果为1(第三次执行),查询虚表,发现虚表中有1,则直接count+1,不用再存key,所以floor(rand(0)*2)不会再被计算。

4).取第三条记录,floor(rand(0)*2)执行一次,结果为0,发现虚表中没有key=0,那么floor(rand(0)*2)会再次执行并存入虚表,此次计算结果为1(第五次执行),与已有的key冲突了,所以插入时报错。

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

四 floor(rand()*2)报错

由此我们可以同样推理出不加入随机因子的情况,由于没加入随机因子,所以floor(rand()*2)是不可测的,因此在两条数据的时候,只要出现下面情况,即可报错,如下图:

最重要的是前面几条记录查询后不能让虚表存在0,1键值,如果存在了,那无论多少条记录,也都没办法报错,因为floor(rand()*2)不会再被计算做为虚表的键值,这也就是为什么不加随机因子有时候会报错,有时候不会报错的原因。如图:

当前面记录让虚表长成这样子后,由于不管查询多少条记录,floor(rand()2)的值在虚表中都能找到,所以不会被再次计算,只是简单的增加count()字段的数量,所以不会报错,比如floor(rand(1)*2),如图:

在前两条记录查询后,虚拟表已经存在0和1两个键值了,所以后面再怎么弄还是不会报错。

总之报错需要count(*),rand()、group by,三者缺一不可

mysql的count报错_Mysql报错注入原理分析(count()、rand()、group by)相关推荐

  1. mysql的count报错_Mysql报错注入原理分析count、rand、groupby

    0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和o ...

  2. mysql注入原理_Mysql报错注入原理分析

    报错类型Duplicate entry报错:多次查询插入重复键值导致count报错从而在报错信息中带入了敏感信息. Xpath报错:从mysql5.1.5开始提供两个XML查询和修改的函数,语法错误导 ...

  3. PageHelper 关闭COUNT(0)查询 以及PageHelper 的分页原理分析

    pagehelper 关闭count(0)查询 以及pagehelper的分页原理分析 情景再现:在给移动端提供分页查询数据接口时,知道他们不需要总条数.但是使用pagehelper 分页查询打印的s ...

  4. mysql查找语句报错_MYSQL报错注入-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....

    目录 审计思路报错语句报错函数查询表floor报错函数讲解报错原理语句xpath语法报错函数讲解语句整数溢出报错exppowcot列名重复报错name_constjoin using几何函数报错不存在 ...

  5. cmd mysql 报错_Mysql报错问题汇总

    1 远程报错问题 报错问题:Host 'XXX' is not allowed to connect to this MySQL server 1.1 防火墙允许3306端口 首先控制面板--防火墙- ...

  6. 报错型sql注入原理分析

    0x00:前言 关于sql注入,经久不衰,现在的网站一般对sql注入的防护也相对加强了,2016年的***测试报告中,出现最多的是xss(跨站脚本***)和明文传输等,但是对sql注入的利用方式,也相 ...

  7. mysql -u 报错_MySQL报错解决!

    大家好:我是小狼,最近工作一直瞎忙,没时间写东西,终于有点时间了,现在我正在搭建extmail服务器,文档是参考这里:http://www.extmail.org/forum/thread-7002- ...

  8. mysql端口测试报错_MySQL报错:2003 - Can't connect to MySQL server on 'localhost' (10038)

    一般报这个错误的原因有以下几个 1.MySQL服务没有启动 2.找不到mysql服务的IP 3.用户没有权限使用远程连接 4.服务器没有开启3306端口或修改后的端口(我就是因为这个错误浪费了一下午的 ...

  9. mysql avg 报错_MySQL报错汇总

    1.Every derived table must have its own alias 解释:这句话的意思是每个派生出来的表必须有一个自己的别名.一般是在多表查询或者子查询的时候会出现这个错误,因 ...

最新文章

  1. unix更喜欢进程,可是...
  2. 华为电脑c语言总是错误,关于华为机试题求代码!解决方法
  3. 一致 先验分布 后验分布_分布式事务常见解决方案与最终一致性
  4. remote: GitLab: Author ‘xxx‘ is not a member of team(Git修改和配置本地用户名和邮箱)
  5. MySQL的replace方法
  6. Ubuntu下编译SHTOOLS
  7. 说说看:如何把自己的导师培养成杰青?
  8. jQuery(2)——如何使用jQuery回显数据
  9. DeepFool: a simple and accurate method to fool deep neural networks
  10. Python:05打印字母联想英文周一到周日(字符串)
  11. NodeJS - 第一个应用程序Hello World
  12. strlen,strcpy,strcat,strcmp函数
  13. 用mysql设计学籍管理系统_学生学籍管理系统(SQL数据库系统设计)(完整版).pdf...
  14. 面试遇见简单算法总结
  15. golang操作elasticsearch详解
  16. 2.12 IC类元器件的封装应该怎么创建?
  17. 联邦学习算法SCAFFOLD的PyTorch实现
  18. Swing-学生管理系统之主页设计
  19. 解决 JS 格式化时间格式错误在苹果手机 IOS 系统上为 NaN
  20. 烟气监测数据转IEC104规约对接电业局平台-国能赤峰生物发电项目

热门文章

  1. IntelliJ IDEA如何垂直或者水平分割标签页
  2. Linux 命令之 cd 命令-切换目录
  3. oracle创建一个表同已存在表结构一样
  4. openpyxl删除添加excel列_Python | 如何使用Python操作Excel(二)
  5. 计算机usb端口没反应,技术编辑教您电脑usb接口没反应怎么办
  6. C/C 语言printf()
  7. python 死循环程序能占满cpu吗_运行tensorflow python程序,限制对GPU和CPU的占用操作...
  8. ajax get请求_python测试开发django50.jquery发送Ajax请求(get)
  9. 将html代码转换为dom,将HTML字符转换为DOM节点并动态添加到文档中
  10. c++ 反射_固体火箭发动机黏接壳体超声C扫描检测系统研制与应用