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