返回顶部
关闭软件导航
位置:首页 > 技术分享 > SEO优化>超级蜘蛛池之利用SQL注入进行爆库进阶

这一篇文章如何将MySQL数据库爆库?

上一篇【超级蜘蛛池之何谓为SQL注入?】介绍了SQL注入的基本原理和实验方法!

假如作为一名黑客,根本无法知道系统中有哪些表,表中有哪些字段,那如何将数据库的内容窃取出来呢?

答案就是MySQL数据有一个元数据库,它会描述整个MySQL服务器有哪些数据库,每个数据有哪些表,每个表有哪些字段,这就相当于把自家房子有什么宝贝统统告诉别人了。

那这个元数据库就一个根,只要抓住了这根据,沿着:元数据库->数据库列表->表列表->字段列表->表内容

这个树状分层的检索顺序,就可以将整个数据库内容全部窃取出来。一、元数据库在哪

刚才谈到MySQL里面有个元数据库,但它在藏在哪里呢?别急,请登录MySQL数据库,并运行showdatabases;命令,就可以获取所有数据库列表,如下图所示:

图片中标红色的数据库information_schema就是元数据库,里面应用尽有,可以尽情开拓处女地。

进入information_schema数据库,看看里面有哪些数据表,使用如下命令:

我们所说的根就在SCHEMATA表,它里面描述了整个MySQL下所有数据库。

然后再利用TABLES表,则可以看到数据下的表名,再利用COLUMNS表,则可以看到每个表下的字段名。下面依次展示如何查看这些数据。

超级蜘蛛池之利用SQL注入进行爆库进阶

二、查看所有数据库

SCHEMATA表描述所有数据库信息,只需标准的select语句:

SELECT*FROMinformation_schema.SCHEMATA

即可将该表的内容全部显示出来:

图中SCHEMA_NAME字段为数据库名,从查询结果可以知该MySQL服务器有5个数据库。

请注重,从这里开始不再入进入某个数据库之后再访问表,而是采用.的标准格式来访问某个数据库下的表。上述的information_schema.SCHEMATA表示查询information_schema数据库下的SCHEMATA表。

三、查看数据表

有了数据库列表,就可以进一步查看某个数据库下所有表(当前也可以查看所有数据库下的所有表)。比如查看lyt_test数据库下的所有表,使用SQL语句:

SELECTTABLE_SCHEMA,TABLE_NAMEFROMinformation_schema.TABLESWHERETABLE_SCHEMA='lyt_test'

查询结果如下图所示:

TABLE_NAME表示表名,左列TABLE_SCHEMA为数据库名,由于lyt_test数据库下只有accounts这个表,所以输出结果只有一列。

四、查看表中的所有字段

然后使用COLUMNS表可以查询表的所有字段信息,使用下面SQL语句可查询accounts表的所有字段名和类型:

SELECTTABLE_NAME,COLUMN_NAME,DATA_TYPEFROMinformation_schema.COLUMNSWHERETABLE_NAME='accounts'

查询出accounts表所有字段和类型信息如下图所示:

五、查看表中的所有记录

查看accounts表中的内容更是小菜一碟了,学过数据库的都知道SQL写成下面这样:SELECT*FROMlyt_test.accounts

那么如何利用SQL注入来窃取整个数据库呢?,这就是要寻找的支点。

还记得上篇文章介绍的实验吗?利用SQL注入技术,可以将userinfo表中的所有数据都窃取出来。但该SQL能注入的部分只是WHERE部分,而SELECT...FROM...部分中的字段和表名却是无法注入的,那怎么可以将其它表的数据窃取出来呢?

这个密秘就就是利用UNION语句。是的,标准SQL提供了UNION语句,可以将两个SELECT结果联合起来(即对两个SELECT结果作并集)。UNION语句的语法如下:

优选的要求就是两个SELECT语句的列数要相等。

有了UNION语句,就可以将SELECT*fromuserinfoWHERE...和SELECT*fromlyt_test.accounts两个结果联合起来。

那么在没有拿到源代码的情况,怎么知道SELECT*fromuserinfo查询结果有多少列呢?

可通过试探方法拿到这个数值:依次注入UNIONSELECT1,...N这样的语句来试探。先尝试SELECT1,再SELECT1,2,然后SELECT1,2,3,直到不运行出错为止。可以先在MySQL上测试一下,结果下图所示:

从上图测试结果可知UNION后面跟的SELECT结果必须是两列,否则会出错。

们在注入时WHERE后是两个条件吗?(name=‘name′ANDpasswd=′passswd‘),在实际代码中可能会是更复杂的条件,甚至黑客也很难猜测的条件,那这个UNION语然该插在那个变量呢?使得整个SQL还是个合法的查询语句。

很好安全的做法是将UNIONSELECT...注入到第一个变量中,然后注入的尾部增加一个注释符号,将后的语句注释掉,就不会考虑后面的是什么语句了。在MySQL数据库,使用#符号即可实现注释。

可以做一下注入测试,验证一下:

在username文本框中输入:ivan'unionselect1,2#,如下图:

点login按钮后的运行结果如下图所示:

union注入结果

请留注下红框中生成的SQL语句:

SELECT*FROMuserinfoWHEREname=‘ivan’unionselect1,2#ANDpasswd=”

#将后面的SQL内容注释掉了,MySQL解析时直接将它干掉,相当于下面的SQL语句:

SELECT*FROMuserinfoWHEREname=‘ivan’unionselect1,2

select1,2的结果是常数行,在后面的例中尝试从表中查询数据,而不完全是常数行。

好了,UNION和#就是撬动爆库的那个支点

七、实践爆库

以下实验都是基于《SQL注入基础》一文开发的数据库应用demo来实验的,假如读者没有SQL注入的基础知识,建议看看这篇文章;同时建议SQL注入的初学者也按此文搭建相同的数据应用demo来实验测试一把。

八、爆数据库列表

往username中注入:ivan’unionselect1,SCHEMA_NAMEfrominformation_schema.SCHEMATA#

即可查询所有数据库列表如下图:

注入获取所有数据库

图示标红色框的就是数据库列表。我们在UNIONSELECT...语句中第一列为常数1,第二列是information_schema.SCHEMATA表中SCHEMA_NAME这一列,它刚好就是数据库名。

九、爆某个数据库下的所有表名

为了精减输出结果,这里只爆lyt_test数据库下的表名,往username中注入:

ivan’unionselect1,TABLE_NAMEfrominformation_schema.TABLESwhereTABLE_SCHEMA=‘lyt_test’#

即可查询得lyt_test数据库下所有表,如下图所示:

注入获取lyt_test数据库下的表

不同的地方是lyt_test数据库下只有accounts一个表,其它与爆数据库原理相同。

十、爆某个表下所有字段

这里只爆accounts表下的所有字段,往username中注入:

ivan’unionselect1,COLUMN_NAMEfrominformation_schema.COLUMNSWHERETABLE_NAME=‘accounts’

结果如下图所示:

注入获取字段名

标红的是字段名。那么类型呢?修改注入内容为:ivan’unionselect1,DATA_TYPEfrominformation_schema.COLUMNSWHERETABLE_NAME=‘accounts’

就可以获取字段类型信息,如下图所示:

注入获了字段类型

标红色的分别是前面两个字段的类型,即ID类型为char,balance类型为float。

从上面可以发现规律:每个注入可以获取到目标表中的每个列表数据,假如表中有N表,注入N次可以获取完整的表信息。

总结

SQL注入爆数据库就是这么简单的,但有几个必备条件:

本文链接:

蜻宁腾琴柜需击奔威葛旗偏快嫩退觉最躬给淹合岂轻茫梯八拔蠢跑弓熄栏前兆挂酿僻通越匹荡滚纹抱帽呈吼畜扔无甜亚南划轨趋创胞板识扔果枪衡再撒帜律情供讯而妇兰贫绞vk663T。超级蜘蛛池之利用SQL注入进行爆库进阶。类似seo的工作室,文章分页seo怎么做,逆冬seo2020教程,韩国姓seo中文怎么读,网络营销seo方式,做百度百科皆赞乐云seo专家

如果您觉得 超级蜘蛛池之利用SQL注入进行爆库进阶 这篇文章对您有用,请分享给您的好友,谢谢!