如果作为一名黑客根本无法知道系统中有哪些表表中有哪些字段网络推广表中有哪些字段那如何将数据库的内容窃取出来呢?
答案就是MySQL数据有一个元数据库它会描述整个MySQL服务器有哪些数据库每个数据有哪些表每个表有哪些字段这就相当于把自家房子有什么宝贝统统告诉别人了。
那这个元数据库就一个根只要抓住了这根据沿着:元数据库 -> 数据库列表->表列表->字段列表->表内容
这个树状分层的检索顺序就可以将整个数据库内容全部窃取出来。一、元数据库在哪刚才谈到MySQL里面有个元数据库但它在藏在哪里呢?别急请登录MySQL数据库并运行show databases;命令就可以获取所有数据库列表如下图所示:
图片中标红色的数据库information_schema就是元数据库里面应用尽有可以尽情开拓处女地。
进入information_schema数据库看看里面有哪些数据表使用如下命令:
我们所说的根就在SCHEMATA表它里面描述了整个MySQL 下所有数据库。
然后再利用TABLES表则可以看到数据下的表名再利用COLUMNS表则可以看到每个表下的字段名。下面依次展示如何查看这些数据。
二、查看所有数据库SCHEMATA表描述所有数据库信息只需标准的select语句:
SELECT * FROM information_schema.SCHEMATA
即可将该表的内容全部显示出来:
图中SCHEMA_NAME字段为数据库名从查询结果可以知该MySQL服务器有5个数据库。
请注意从这里开始不再入进入某个数据库之后再访问表而是采用<数据库名>.<表名>的标准格式来访问某个数据库下的表。上述的information_schema.SCHEMATA表示查询information_schema数据库下的 SCHEMATA表。
三、查看数据表有了数据库列表就可以进一步查看某个数据库下所有表(当前也可以查看所有数据库下的所有表)。比如查看lyt_test数据库下的所有表搜索引擎就可以进一步查看某个数据库下所有表(当前也可以查看所有数据库下的所有表)。比如查看lyt_test数据库下的所有表使用SQL语句:
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'lyt_test'
查询结果如下图所示:
TABLE_NAME表示表名左列TABLE_SCHEMA为数据库名由于lyt_test数据库下只有accounts这个表所以输出结果只有一列。
四、查看表中的所有字段然后使用COLUMNS表可以查询表的所有字段信息使用下面SQL语句可查询accounts表的所有字段名和类型:
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_NAME = 'accounts'
查询出accounts表所有字段和类型信息如下图所示:
查看accounts表中的内容更是小菜一碟了学过数据库的都知道SQL写成下面这样:SELECT * FROM lyt_test.accounts
还记得上篇文章介绍的实验吗?利用SQL注入技术可以将userinfo表中的所有数据都窃取出来。但该SQL能注入的部分只是WHERE部分而SELECT ... FROM ...部分中的字段和表名却是无法注入的那怎么可以将其它表的数据窃取出来呢?
这个密秘就就是利用UNION语句。是的标准SQL提供了UNION语句可以将两个SELECT结果联合起来(即对两个SELECT结果作并集)。UNION语句的语法如下:
SELECT column_name1(s) FROM table_name1
UNION
SELECT column_name2(s) FROM table_name2
唯一的要求就是两个SELECT语句的列数要相等。
有了UNION语句就可以将 SELECT * from userinfo WHERE ...和 SELECT * from lyt_test.accounts两个结果联合起来。