information_schema

在利用sql注入漏洞的时候,会经常用到information_schema这个数据库。information_schema数据库是MySQL自带的,MySQL 5以下没有这个数据库,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。也就是说information_schema中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库的内容如图

在sql注入过程中,最重要的表一般是3个,分别是schemata,tables,columns。
SCHEMATA:提供了当前mysql数据库中所有数据库的信息,其中SCHEMA_NAME字段保存了所有的数据库名。show databases的结果取自此表。

TABLES:提供了关于数据库中的表的信息,详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,其中table_name字段保存了所有列名信息,show tables from schemaname的结果取自此表。

COLUMNS:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息,其中column_name保存了所有的字段信息。show columns from schemaname.tablename的结果取自此表。
这三个表的相关重要结构如下:

  • schemata 存放所有的数据库名
    • schema_name 数据库名
  • tables 存放所有的表名
    • table_name 表的名字
    • table_schema 表所属数据库的名字
  • columns 所有的列名
    • column_name 列名
    • table_name 列所属的表名
    • table_schema 列所属的数据库名

注入中利用information_schema

当发现sql注入漏洞时,一般可以用information_schema数据库查找自己感兴趣的数据信息。一般的使用逻辑如下:
假设在正常情况下sql查询的返回值有3列,那么在利用union注入时,也应改构造返回3列的查询子句,例如select 1,2,3
下面将对一些常用用法进行介绍(为了方便,就直接写出union后的查询语句)
首先可以利用schemata表获取所有数据库名select 1,schema_name,3 from information_schema.schemata
现在假设查询到了有一个数据库名为’mynote’,我们想知道这个数据库里面有哪些表,可以利用tables表
select 1,2,table_name from information_schema.tables where table_schema='mynote'
我们查到了mynote下有一个数据表叫’list’,现在想知道该表下有哪些字段,可以用columns表
select 1,2,column_name from information_schema.columns where table_name='list'
查询到了两个字段’user’,’liuyan’
这样我们就知道了数据库’mynote’的结构:

  • mynote 数据库
    • list 表
      • user 列名
      • liuyan 列名

接着我们就可以查询到自己想要的字段值信息了。