ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL注入中information_schema的作用

2021-10-22 09:05:14  阅读:170  来源: 互联网

标签:information NAME 数据库 sqli SQL TABLE schema


 在MySQL数据库的注入中,如果你有仔细看过SQL注入语句的话,你可能就会发现,在获取数据库名、表名和字段的时候,注入语句中information_schema这个数据库出现得很频繁,那么有没有想过为什么会需要用到这个数据库呢? 这个数据库又是什么?它里面保存了什么?

      information_schema数据库是MySQL自带的,MySQL 5以下没有这个数据库,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。也就是说information_schema中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。

      在phpmyadmin中,在左侧点击information_schema数据库。

 

 显示了该数据库中的所有表,由于表数量太多,只截了一部分,可以拉动右边的滚动条查看所有表。

 

也可以执行如下SQL语句来查看该库中的所有表:

      show tables;

需要注意的是,要在information_schema这个数据库中执行该SQL语句。如何进入information_schema数据库执行SQL语句,请参考前面进入sqli数据库执行SQL语句的步骤。

      这上面显示的表,它们实际上是视图,而不是基本表,所以你在数据库的数据保存目录,会看不到这个数据库的实体文件。数据库的数据保存在 C:\wamp\bin\mysql\mysql5.6.17\data 目录,在这个目录下一共有如下4个目录:

 

 想要查看数据库的数据保存目录,可以执行select @@datadir

 

  每一个目录对应数据库中的一个数据库,在数据库中执行show databases;的时候,可以看到存在5个数据库,正是少了information_schema这个数据库。

 

  然后在弹出来的列表中点击MySQL,再选择MySQL控制台。 会弹出一个命令行窗口,这就是mysql客户端,此时要求输入密码,由于root的密码为空,直接回车即可

 

  进入information_schema 数据库,命令为:use information_schema; 。一定要注意后面记得加分号,分号表示一个语句结束,如果没有检测到你输入分号,它会认为你一个语句还没结束,直到碰到分号后,才开始执行语句。

 

 首先执行show databases;查看所有的数据库,然后再执行select schema_name from schemata;。

 

 desc 可以用来看表结构。看下tables的表结构,执行desc tables;

 

 注意上图中标记的那2条记录,每一条记录中,他们分别记录一个表名和一个这个表所属的库名。其中TABLE_NAME保存的是表名,而TABLE_SCHEMA保存的是这个表名所在的数据库。我们可以查询一条记录看看,在查询前,先看看有多少条记录,避免记录太多查看不方便,执行select count(*) from tables; 

 

 说明当前所有数据库中的表数量为142。查询任意一条记录查看,我这里选择最后一条记录,SQL语句为:select * from tables limit 141,1\G由于在客户端中,默认查询结果显示不友好,所以,可以把语句后面的分号改成\G,他会让一条记录显示一行,看起来不那么乱。\G只支持在客户端中用,在其他连接数据库的软件中,使用\G会报错。

 

  可以看到,最后一条记录的TABLE_NAME是user,TABLE_SCHEMA为sqli。查看sqli数据库中的表,SQL语句为:show tables from sqli;可以看到确实存在user表。

    既然information_schema的TABLES表中的TABLE_SCHEMTA字段是保存的数据库名,而TABLE_NAME保存了表名,那么我们就可以使用TABLE_SCHEMTA字段作为查询条件,查询TABLE_NAME,即可得知所有指定数据库中的所有表名。比如,我们想要通过information_schema数据库来查询sqli数据库中所有的表,那么就可以使用如下SQL语句:

      select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = 'sqli';

      如果当前库为information_schema,则可以省略不写,否则跨库查询的时候,需要带上库名。

  通过修改TABLE_SCHEMA 的限制,可以查询任意数据库中的所有表名,网上的通过注入爆表名便是这个原理。

      知道了表名,那么如何获取表中的字段呢?要知道我们没有表名的话,会把所有的数据查询出来,而如果注入没有回显,不能进行union查询,那么想要获取我们的标目数据,无疑效率极低。

      幸运的是,在information_schema数据库中,同样存在一个表,它保存了整个数据中,所有的列名,这个表就是COLUMNS。同样先查看该表结构。

 

 这里面,与注入相关的存在3个字段,分别是TABLE_SCHEMA、TABLE_NAME以及COLUMN_NAME,不难猜到,如果在该表中查询一条记录,TABLE_SCHEMA保存了这条记录保存的字段所属的数据库名,而TABLE_NAME保存的是该字段所属表名,COLUMN_NAME则是一个列名记录,查询一条记录验证一下,首先确定该表有多少条记录,执行select count(*) from columns;,得知一共有1662条记录

 

    我们获取最后一条记录,执行select * from columns limit 1661,1\G

其中COLUMNS_NAME为ip,TABLE_NAME为user,TABLE_SCHEMA为sqli,这说明,在sqli这个数据中,user表存在一个ip的列,也就是我们常说的ip字段。

      查看sqli的user表是否存在该字段,执行SQL语句:show columns from sqli.user;

我们要通过information_schema数据库的columns表查询sqli数据库中user表中所有的字段,可以执行如下SQL语句:

      select column_name from information_schema.columns where TABLE_SCHEMA='sqli' and TABLE_NAME='user';

 

 

 

 

 

 

 

 查询结果与show columns from sqli.user; 一致。

 

标签:information,NAME,数据库,sqli,SQL,TABLE,schema
来源: https://www.cnblogs.com/dun1572523/p/15437078.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有