前言
对于常见的mysql注入来说,我们常利用mysql中自带存储整个数据信息的information_schema数据库来注入查询数据。但是当我们遇到正则将其关键字,例如information禁掉后该如何注入呢?或许你有千万种敏感字符绕过姿势,但是今天我在逛国外网站时发现有人提到了innodb,所以我就测试了下,发现其可以在特定版本中替代information_schema库作为注入数据的突破口。
Mysql>5.6.x
在Mysql中,存储数据的默认引擎分为两类。一类是在5.5.x之前的MyISAM数据存储引擎,另一类是5.5.x版本后的innodb引擎。并且mysql开发团队在5.5.x版本后将innodb作为数据库的默认引擎。
而在mysql 5.6.x版本起,innodb增添了两个新表,一个是innodb_index_stats,另一个是innodb_table_stats。查阅官方文档,其对这两个新表的解释如下图:
从官方文档我们可以发现两个有用的信息:
本地实验
那么我们来本地实验下,我是用mysql 5.7.2版本来实验
select @@innodb_version;
查看已有的数据库
查看innodb_table_stats表中的数据
select * from mysql.innodb_table_stats;
表中只有两个系统数据库和一个user数据库和对应表名,以及最后更新时间。这个结果很是让人疑惑,既然有数据,但是为什么数据不全,单单只出现了一个数据库。再次查阅官方文档,从文档的实例中发现这两个表其实是用于记录更改和新创建的数据库和表的信息,但准确的说是保存最近的数据库变动记录,但是具体会保留多久呢?官方文档是写的是InnoDB Persistent Statistics Tables(永久记录表)。观察表中显示user数据库是11月4号创建的,而笔者测试的时候是11月14号,中间相隔10天。那么这里我们再次创建一个inno_test的数据库。
发现也被记录了下来。于是我们就有了取代information_schema的注入payload
select table_name from mysql.innodb_table_stats where database_name=schema();
就能够成功注入。