如何利用sql注入进行爆库

SQL注入能做什么

在《SQL注入基础》一文介绍了SQL注入的基本原理和实验方法,那接下来就要问一下,SQL注入到底能什么?

估计很多朋友会这样认为:利用SQL注入最多只能获取当前表中的所有记录,但无法获取其它表的内容,事实果真的如此?

正像小偷从窗户爬进入房间,难道他只能在房间内偷东西?非也,他可以将整个房子洗劫一空。

不相信?那来看看如何对MySQL进行爆库。

如何将MySQL数据库连根拔起

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

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

那这个元数据库就一个根,只要抓住了这根据,沿着:

元数据库 -> 数据库列表->表列表->字段列表->表内容

这个树状分层的检索顺序,就可以将整个数据库内容全部窃取出来,下面就跟大家演示。

元数据库在哪

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

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

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

我们所说的根就在SCHEMATA表,它里面描述了整个MySQL 下所有数据库。 
然后再利用TABLES表,则可以看到数据下的表名,再利用COLUMNS表,则可以看到每个表下的字段名。下面依次展示如何查看这些数据。

查看所有数据库

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

SELECT * FROM information_schema.SCHEMATA

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

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

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

查看表

有了数据库列表,就可以进一步查看某个数据库下所有表(当前也可以查看所有数据库下的所有表)。比如查看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

结果如下: 

好了,到这里相信你已经学习如何从MySQL中窃取所有数据库内容了。

寻找个支点

伟大的物理学家阿某米德曾经说过:

给我一个支点,我可以撬起整个地球

前面从技术上介绍了在不知道MySQL数据如何设计的情况下,通过元数据库informatio_schema,一步步将整个数据库内容窃取出来。

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

还记得上篇文章介绍的实验吗?利用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
  • 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 = ‘name′ANDpasswd=′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#

时间: 2024-10-06 17:52:34

如何利用sql注入进行爆库的相关文章

利用SQL注入漏洞登录后台的实现方法

利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的.  如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的.  前些天,网上传

利用SQL注入漏洞登录后台

题记:工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的. 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的. 前些天,网上传得沸沸扬扬的“拖库”事件给我们敲响了安全警钟. 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常

利用SQL注入漏洞登录后台的实现方法 。。。。转载

一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e) DBMS接受返回的结果,并处理,返回给用户 因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活的话). 下面,我通过一个实例具体来演示下SQL注入 二.SQL注入实例详解(以上测试均假设服务器未开启magic

利用sql注入

INSERT查询中实现注入攻击 1. 思路就是在含有insert语句的页面插入目标值信息.经常包含的是一个子查询. 2. 注意在insert过程中,左边的注入点和右边的注入点会有不同 3. 在mysql中数字的优先级会高于字符的优先级,在1+'s'结果只显示1 4. 利用此性质,配合ASCII函数可以获得大部分目标的值. 生成INSERT错误 1. 在insert语句的值中填写表不允许的数据,正好这个数据是我们需要的目标值,就可在错误报告中查看. 2. 通过错误的insert可以在不污染数据的情

利用SQL注入获取服务器最高权限

单位有台数据库服务器(windows 2000 操作系统,sql server 2000) 前段时间莫名其妙的被攻击了 跑到机房,通过PE进去一看,发现多了一个账户(SQLDEBUG).并且administrator账户被禁用了 看看数据没少,也没太在意.利用PE把账户破解了一下,就回单位了 今晚回来刚好要去数据库服务器上,下个数据库备份文件.结果发现密码又登陆不了. 不祥预感出来了.难道我又要坐3个小时汽车去机房? 最关键的是,前段时间刚去过机房.星期一又去 .丢不起这个人呐! 第一反应想..

详解强大的SQL注入工具——SQLMAP

1. 前言  Windows下的注入工具好的又贵,免费的啊D.明小子等又不好用,我们根本没必要花 时间去找什么破解的havij.pangolin什么的,特别是破解的工具很可能被绑了木马.其实 Linux下的注入工具也是非常强大的,不过分的说,可以完全取代Windows下面的所有注入 工具.  就如backtrack系统里面就有非常丰富的注入工具,对MSSQL.MYSQL.oracle等各种 数据库的应有尽有了,而且这些工具都是免费的,并且是开放源代码的,我们还可以用来修 改为合适自己使用的注入工

初识sql注入及sqlmap

对于sql注入小白的我,上午在红黑联盟的网站上恶补了一下sql注入的基础知识,(走马观花)似乎明白sql注入是怎么一回事,也看了一些关于sqlmap的资料,再次记录一下吧 下面是关于sqlmap这个工具的介绍,发现两篇介绍sqlmap的文章(自己觉得不错):有一篇叫<sql注入之sqlmap入门>的文章介绍了sqlmap, 文章来源:http://www.freebuf.com/articles/web/29942.html 安全攻防之SQL注入(通过sqlmap搞定所有问题) 文章来源:ht

sql注入攻防 以php+mysql为例

随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列.但是由于程序员的水平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上的实现,很少或是根本没有考虑应用的安全性问题.这就导致了很多应用都存在不同程度的安全漏洞.SQL注入便是其中的一种. SQL注入作为一种很流行的攻击手段,一直以来都受到网络安全研究者和黑客们的广泛关注.那什么是SQL注入呢?SQL注入是这样一种攻击技术:攻击者通过把恶意SQL命令插入到Web表单的输

一条短信控制你的手机! Android平台的SQL注入漏洞浅析

14年11月笔者在百度xteam博客中看到其公开了此前报告给Google的CVE-2014-8507漏洞细节——系统代码在处理经由短信承载的WAP推送内容时产生的经典SQL注入漏洞,影响Android 5.0以下的系统.于是对这个漏洞产生了兴趣,想深入分析看看该漏洞的危害,以及是否能够通过一条短信来制作攻击PoC. 在断断续续的研究过程中,笔者发现了SQLite的一些安全特性演变和短信漏洞利用细节,本着技术探讨和共同进步的原则,结合以前掌握的SQLite安全知识一同整理分享出来,同各位安全专家一