当前位置:网站首页 > SQL数据库编程 > 正文

mysql导入sql文件跳过错误(mysql跳过报错继续导入)



今天主要分享下sql注入中的报错型,在大多网上的文章会列出类似于公式的句子,却没解释为什么要使用这样的函数,为什么使用这个函数会出现报错而导致sql注入。

报错注入updatexml mysql版本_键值

0x01:报错过程

我们先来了解几个函数。

报错注入updatexml mysql版本_sql注入_02

报错注入updatexml mysql版本_数据库_03

报错注入updatexml mysql版本_sql注入_04

报错注入updatexml mysql版本_数据库_05

6. 将之前的rand()函数和floor()函数整合起来。

报错注入updatexml mysql版本_数据库_07

7.查询名字太长,我们来起个别名。

报错注入updatexml mysql版本_sql注入_08

8.我们再一次进行查询,information_schema.tables有多少个表哥,会显示多少列。

报错注入updatexml mysql版本_虚表_09

报错注入updatexml mysql版本_虚表_10

10. count() 统计元祖的个数(相当于求和)。

报错注入updatexml mysql版本_键值_11

11.接着,我们多重复几次。

报错注入updatexml mysql版本_数据库_12

0x02:

    rand()和rand(0)

1.加上随机因子后,执行多次每次都会报错。为了更彻底的说明报错原因,直接把随机因子去掉,再来一遍看看。

报错注入updatexml mysql版本_虚表_13

2.先看一条记录的时候,一条记录的话 无论执行多少次也不报错

报错注入updatexml mysql版本_虚表_14

3.然后增加一条记录,两条记录的话 结果就变成不确定性了

报错注入updatexml mysql版本_sql注入_15

报错注入updatexml mysql版本_sql注入_16

报错注入updatexml mysql版本_键值_17

随机出现报错,然后再插入一条,三条记录之后,也和2条记录一样进行随机报错。由此可见报错和随机因子是有关联的

floor(rand(0)*2)报错的原理是恰恰是由于它的确定性,因为floor(rand()*2)不加随机因子的时候是随机出错的,而在3条记录以上用floor(rand(0)*2)就一定报错,由此可猜想floor(rand()*2)是比较随机的,不具备确定性因素,而floor(rand(0)*2)具备某方面的确定性。

我们分别对floor(rand()*2)和floor(rand(0)*2)在多记录表中执行多次。

报错注入updatexml mysql版本_虚表_18

报错注入updatexml mysql版本_虚表_19

可以看到,floor(rand()*2)毫无规律可言,而floor(rand(0)*2)是有规律的。

那么mysql在遇到select count(*) from tables group by x;这语句的时候会建立一个虚拟表(实际上就是会建立虚拟表),整个工作流程就会如下图所示:

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

报错注入updatexml mysql版本_虚表_20

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

报错注入updatexml mysql版本_数据库_21

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

其实mysql官方有给过提示,就是查询的时候如果使用rand()的话,该值会被计算多次,那这个“被计算多次”到底是什么意思,就是在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次,我们来看下floor(rand(0)*2)报错的过程就知道了,从0x04可以看到在一次多记录的查询过程中floor(rand(0)*2)的值是定性的,为011011…(记住这个顺序很重要),报错实际上就是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(主键键值必须唯一),所以插入的时候就直接报错了

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

0x04:loor(rand()*2)报错

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

报错注入updatexml mysql版本_键值_22

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

0x05:updatexml报错

MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数,分别是ExtractValue()和UpdateXML()

我们要学习的便是mysql里的修改函数即updatexml函数

其实也有extractvalue注入 以后的文章再做介绍。

先来做如下操作

报错注入updatexml mysql版本_键值_23

执行一下报错payload:

and updatexml(1,concat(null,(select @@version),null),1);

报错注入updatexml mysql版本_sql注入_24

updatexml的爆错原因很简单,updatexml第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错。

updatexml的最大长度是32位的,所以有所局限(PS:但是应对大多的已经足够。)如果密码长度超过了32位就不会被显示出来。

0x06:其余报错函数

extractvalue()id = 1 and (extractvalue(1, concat(0x5c,(selectuser()))))

报错注入updatexml mysql版本_sql注入_25

exp()id =1 and EXP(~(SELECT * from(select user())a))

报错注入updatexml mysql版本_数据库_26

这六个函数总的来说归于一类

报错注入updatexml mysql版本_虚表_27

基于篇幅问题,剩下就不解释原理了,有机会,后面还会详细的介绍。

转载于:https://blog.51cto.com/wt7315/

到此这篇mysql导入sql文件跳过错误(mysql跳过报错继续导入)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • pymysql怎么安装(pymysql如何安装)2026-01-22 19:45:06
  • sql增删改查(MySQL增删改查)2026-01-22 19:45:06
  • sqlyog打开sql文件(sqlplus打开sql文件)2026-01-22 19:45:06
  • .sql文件有什么用(sql是什么文件格式)2026-01-22 19:45:06
  • SQL窗口函数面试题(sql的窗口函数面试题)2026-01-22 19:45:06
  • 为什么用redis不用mysql(为什么用redis不用本地缓存)2026-01-22 19:45:06
  • plsql12注册码(plsql10注册码)2026-01-22 19:45:06
  • mysql主键是唯一的吗(mysql中的主键)2026-01-22 19:45:06
  • sql文件怎么导入数据库plsql(sql文件怎么导入数据库mysql软件)2026-01-22 19:45:06
  • mysql查询锁表的sql(mysql查看锁表的sql)2026-01-22 19:45:06
  • 全屏图片