SQL Injection(1)

来源:互联网 发布:市场大数据分析 编辑:程序博客网 时间:2024/06/16 20:45

在MySQL中,枚举数据库是有一定的顺序的,首先是提取数据库名称,然后是表、列,最后才是数据本身,遵循一种分级的方法。
通常最先想知道的是执行查询的用户名,可使用下列查询:

SELECT user();SELECT current_user;

如果想列出安装在远程MySQL上的数据库,可使用下列查询(假设拥有管理员权限):

SELECT distinct(db) FROM mysql.db

远程MySQL为5.0或更高的版本,可以使用information_schema并通过注入下列内容获取相同信息:

SELECT schema_name FROM information_schema.schemata;

information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。

下面是重要的数据字典表

  • SCHEMATA表:提供了关于数据库的信息。
  • TABLES表:给出了关于数据库中的表的信息。
  • COLUMNS表:给出了表中的列信息。
  • STATISTICS表:给出了关于表索引的信息。
  • USER_PRIVILEGES表:给出了关于全程权限的信息。该信息源自mysql.user授权表。
  • SCHEMA_PRIVILEGES表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。
  • TABLE_PRIVILEGES表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。
  • COLUMN_PRIVILEGES表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。
  • CHARACTER_SETS表:提供了关于可用字符集的信息。
  • COLLATIONS表:提供了关于各字符集的对照信息。
  • COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。
  • TABLE_CONSTRAINTS表:描述了存在约束的表。
  • KEY_COLUMN_USAGE表:描述了具有约束的键列。
  • ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。
  • VIEWS表:给出了关于数据库中的视图的信息。
  • TRIGGERS表:提供了关于触发程序的信息。

查询完information_schema可以枚举整个数据库的结构。
其中有一个库很有意思customers_db

SELECT table_schema,table_name FROM informaiton_schema.tables WHERE table_schema='customers_db'

如果想获取所有数据库的所有表,只需忽略where字句。

SELECT table_schema,table_name FROM informaiton_schema.tables 

如果想检索除了mysql 和information_schema这两个内置数据库之外的所有表,因为不存在想要的目标信息

SELECT table_schema,table_name FROM informaiton_schema.tables WHERE table_schema!='mysql' AND table_schema!='information_schema'

想要查询一个有关所有数据库、表和列的完整视图,如下查询语句

SELECT table_schema,table_name,column FROM information_schema,columns WHERE table_schema!='mysql' AND table_schema !='information_schema';

还有另一种方法来寻找包含自己感兴趣内容的列的表,比如

SELECT table_schema,table_name,colunm_name FROM information_schema.schema.columns WHERE column_name LIKE 'password' OR column_name LIKE 'credit_card'

查询各种用户的权限

SELECT grantee,privilege_type,is_grantable FROM information_schema.user_privileges;

需要特别强调的是informaiton_schema只适用于MySQL5及以后的版本,面对早期版本只能通过暴力攻击来确定表名和列名。我们可以先访问存储在数据库上的文件,将其原始内容导入到我们创建的一张表中,然后使用前面的技术提取该表
数据库的文件保存在于数据库名称相同的目录下,此目录包含在主MySQL数据目录中

SELECT @@datadir

数据库的所有表包含在扩展名为myd的文件中,例如mysql数据库默认的一些MYD文件:

  • tables_priv.MYD
  • host.MYD
  • help_keyword.MYD
  • columns_priv.MYD
  • db.MYD

可使用load_file来提取

SELECT load_file('databasename/tablename.MYD')

load_file允许检索的字节数有个最大值,该值由@@max_allowed_packet变量指定,所以该技术不使用于存储了大量数据的表