0x00 疑问

一直在用mysql数据库报错注入方法,但为何会报错?

百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和order by一起使用,也没彻底说明三者同时使用报错的原理。

0x01 位置问题?

select count(*),(floor(rand(0)*2))x from information_schema.tables group by x; 这是网上最常见的语句,目前位置看到的网上sql注入教程,floor 都是直接放count(*) 后面,为了排除干扰,我们直接对比了两个报错语句,如下图

由上面的图片,可以知道报错跟位置无关。

0x02 绝对报错还是相对报错?

是不是报错语句有了floor(rand(0)*2)以及其他几个条件就一定报错?其实并不是如此,我们先建建个表,新增一条记录看看,如下图:

确认表中只有一条记录后,再执行报错语句看看,如下图:

多次执行均未发现报错。

然后我们新增一条记录。

然后再测试下报错语句

多次执行并没有报错

OK 那我们再增加一条

执行报错语句

ok 成功报错

由此可证明floor(rand(0)*2)报错是有条件的,记录必须3条以上,而且在3条以上必定报错,到底为何?请继续往下看。

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

为了更彻底的说明报错原因,直接把随机因子去掉,再来一遍看看,先看一条记录的时候,如下图:

一条记录的话 无论执行多少次也不报错

然后增加一条记录。

两条记录的话 结果就变成不确定性了

随机出现报错。

然后再插入一条

三条记录之后,也和2条记录一样进行随机报错。

由此可见报错和随机因子是有关联的,但有什么关联呢,为什么直接使用rand(),有两条记录的情况下就会报错,而且是有时候报错,有时候不报错,而rand(0)的时候在两条的时候不报错,在三条以上就绝对报错?我们继续往下看。

0x04 不确定性与确定性

前面说过,floor(rand(0)*2)报错的原理是恰恰是由于它的确定性,这到底是为什么呢?从0x03我们大致可以猜想到,因为floor(rand()*2)不加随机因子的时候是随机出错的,而在3条记录以上用floor(rand(0)*2)就一定报错,由此可猜想floor(rand()*2)是比较随机的,不具备确定性因素,而floor(rand(0)*2)具备某方面的确定性。

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

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

可以看到floor(rand(0)*2)是有规律的,而且是固定的,这个就是上面提到的由于是确定性才导致的报错,那为何会报错呢,我们接着往下看。

0x05 count与group by的虚拟表

使用select count(*) fromT-Safegroup by x;这种语句的时候我们经常可以看到下面类似的结果:

可以看出 test12的记录有5条

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

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

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

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

那这个和报错有啥内在联系,我们直接往下来,其实到这里,结合前面的内容大家也能猜个一二了。

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

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

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

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

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

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

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

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

由0x05我们可以同样推理出不加入随机因子的情况,由于没加入随机因子,所以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、groupby相关推荐

  1. mysql的count报错_Mysql报错注入原理分析(count()、rand()、group by)

    报错需要count(*),rand().group by,三者缺一不可 前提:当行数大于等于3行时才会报错. 原链接:https://www.cnblogs.com/xdans/p/5412468.h ...

  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. java之Scanner
  2. socket编程报异常java.io.EOFException
  3. Windows的驱动开发模型
  4. SQL Sever索引
  5. ThreadLocal怎么实现线程隔离的?可见性问题?为什么要重新定义一个threadLocalHashCode?为什么有内存泄露?弱引用又是什么?
  6. 博士申请 | 香港科技大学陈浩教授招收AI医疗方向全奖博士/博后/实习生
  7. 最接近的三数之和Python解法
  8. 计算机内部运算的部件是什么意思,运算器是执行什么和什么运算的部件
  9. 【Antlr】Antlr 孤岛语法:处理相同文件中的不同格式
  10. 奇安信代码安全实验室帮助微软修复远程内核级漏洞,获官方致谢
  11. C程序设计--查找(二分法查找/折半查找)
  12. php laravel 图片下载
  13. 3D 锥形图表echarts
  14. http://www.cnblogs.com/qianmojing/p/6142178.html
  15. 安防大数据时代,IP摄像机的发展历程
  16. 『杭电1900』Gangs
  17. Python格式化JSON文件
  18. java实现扫码微信登录_java实现简单扫码登录功能(模仿微信网页版扫码)
  19. Ubuntu Server上如何安装Gi
  20. finalize方法的使用

热门文章

  1. MicroBlaze程序融合fpga的bit并烧写入Flash方法
  2. 工作原理_逆变器工作原理
  3. mysql模式匹配用什么关键字_MYSQL模式匹配:REGEXP和like用法
  4. upload-labs_pass12_文件名截断_URL要编码为%00_pass13_文件名截断_Hex修改为00
  5. 丽水数据可视化设计价格_50个数据可视化最有价值的图表(建议收藏)
  6. 电脑自带 超强系统文件自检 分享
  7. NodeJs-- 新建项目实例
  8. jfinal文件上传
  9. Delphi 正则表达式语法(9): 临界匹配 - 也叫预搜索与反向预搜索
  10. CentOS6.2 自定义系统调用