[深入学习Web安全](5)详解MySQL注射

  0x00 目录

  0x00 目录

  0x01 MySQL注射的简单介绍

  0x02 对于information_schema库的研究

  0x03 注射第一步——确定查询语句的查询对象个数0x04 注射第二步——UNION联合查询

  0x05 注射第三步——MySQL基础信息收集

  0x06 注射第四步——通过利用点GET敏感表及列

  0x07 注射第五步——通过已知表、列GET数据

  0x01 MySQL注射的简单介绍

  MySQL的注射,我们已经在第4篇文章的演示过了,我们就来简单的总结下,我们MySQL注射的利用点。

  首先,我们先来说下现在几乎没什么网站用的Access数据库吧,在最早期的Web安全技术的学习中,我们最早接触到的工具相信都是啊D和明小子,而这两款工具正是针对与Access数据库的注射漏洞的利用工具。

  而提到Access的注射,相信大家都能想到两个字“爆破”或者是“猜解”。对,这就是Access数据库存在SQL注射漏洞时的利用点,而我们第4篇文章中所演示的MySQL注射的利用点,自然不是“猜解”。(顺便说一下,我说的只是针对于MySQL5及以上版本)这种注射的利用点是information_schema这个默认数据库,这里面记录了该MySQL数据库所存储的所有数据。

  所以,针对于MySQL数据库的注射都是利用提取information_schema库里的信息来获取表名与列名的。

  0x02 对于information_schema库的研究

  

  

  既然这类注射的利用点在于information_schema这个默认库,那么自然,我们就应该增进对于这个库的一些了解,接下来,我们就来研究下这个information_schema库。

  首先,我们启动MySQL服务,并且登录MySQL:

然后,我们还是来看下存在的数据库:

  我们看到了information_schema数据库,也就证明了我安装的MySQL版本大于5,我们可以来看下具体版本:

  我们可以看到版本是5.6.17。接着,我们进入information_schema库:

接着,我们来show一下表:

  可以看到,这个库里面有很多表,而我们获取其他数据库里的表、列名情况所利用的是一个叫tables的表,如下图:

我们看看这个tables表里存在那些column:

  可以看到,tables表里情况复杂。。。我们所需要学习的只是其中几个,包括table_name、colum_name、table_schema,如图:

  还有一个没圈到,可能是在下面,也可能是我眼睛不好。。。。我先来了解下table_schema这个列:

  这里面包含了所有我们安装在这个MySQL上的数据库的db_name,会有很多重复,接着,我们来看下table_name里的情况:

  这个表里则包含了该MySQL安装过的表的名字,好了,关于这个infromation_schema的库,我就写到这里,because我们的主题不是这个。

  0x03 注射第一步——确定查询语句的查询对象个数

  我们在第4篇的通用注射方式里的第一步就是确定原查询语句的查询对象的个数,什么意思呢?

  其实很简单,我们还是使用第4篇的栗子,我把MySQL切换到sqli数据库:

然后,用上节课的SQL模型,如下:

  这个X的位置,便是我们能够注射的位置,这个查询对象是什么意思呢?

  其实,在这里查询对象就是data,个数就是1。这样或许大家还是不能理解,那我们举如下栗子:

  这次查询对象就变为了*,但是长度却改变了,因为*代表的是ALL的意思,那我们就来看看在news表中到底有几个对象:

  我们能看到,news表中有两个列,所以,这次的查询对象个数就是2。

  但是,我们进行SQL注射只能控制SQL语句的一个部分,而不能知道原本的查询语句啊,那怎么办?

  这时,我们就只能劳靠order by了,我们来看如下的栗子(还是一样的SQL模型):

  我们在上面的栗子中可以看到,第一次查询是正常的查询,返回正常的查询结果,而第二次查询则是加了order by 1,达到的效果就是返回正常查询结果,因为原SQL模型的查询对象个数就是1,而第三次查询则使用了order by 2,而原查询语句的查询对象个数是1,而不是2,所以产生了错误。

  这就是利用order by来获取未知查询语句的查询对象个数。

  0x04 注射第二步——UNION联合查询

  好滴,接下来,我们就要使用联合查询了,这个union到底是拿来干啥的啊,很不解对吧,那我们就先来学习一下union。

  我们先来执行如下SQL语句,并查看结果:

  可以看到select什么就是什么,接着,我们来看一下下面这个图(别闲枯燥,都是为了后面做铺垫):

这就是news表里的全部数据,我们想一下,我们有如下程序:

  这个程序,我们假设它叫test.php吧,关于getData()函数,图上有注释,我们想,当id为1~9的时候,这个程序确实没任何问题,但是试想,当id等于10的时候,就没法查询出结果,说不定还会报错,这样很影响用户体验。

  所以,有时,可以使用union来解决这种问题,例如如下SQL模型就能解决这种问题:

  X的位置就是刚才那个程序的id参数的拼接处,这样就解决了刚才说的问题,不信我们来看:

  可以看到,在第一次查询时id为1,的确存在这个数据,于是正常返回查询结果,其实也不完全正常,因为还多了个Error,但是这个很好处理,直接在mysql_fetch_array()之后的返回值里取数组的[0]就可以了。

  而第二次查询,id为10,不存在这条数据,于是,语句错误了,所以查询结果就变成了Error。

  Ok,就是这样,这就是UNION的基础用法,但是还没转过弯来的同学可能还会问那刚才为什么要order by?

  其实,这也怪我,没讲清楚,我们来看如下栗子:

  很明了吧,嘿嘿,好了。我们最后在说一个问题,当我们有原语句出现错误时,我们的union的内容就会替换掉查询结果,其实类似于如下等式:

  select * from news where id=10 union select 'Error',1000;

  =

  select 'Error',1000;

  好了,接着就是下一个内容了。

  0x05 注射第三步——MySQL基础信息收集

  

  

  Ok,基础的东西终于唠完了,我们就来玩玩吧,我们先看下面这样一个列表:

  database()  当前数据库

  version() 数据库版本

  user() 当前用户

  就这样三个基础信息吧,我们先直接查询下:

  我们可以看到如下几个基础信息,根据我们0x04里最后提的等式,可以构造出如下SQL语句来GET这些信息:

OK,长话短说了我们试试吧,首先是GET当前库:

接着是数据库版本:

最后是当前用户:

  OK,就这么简单,其实注射并不难,只是缺少系统性的资料以及各种资料的“质量”参差不齐才导致有很多朋友觉得SQL注射很难学。

  0x06 注射第四步——通过利用点GET敏感表及列

  好滴,接着,我们来到了0x06,真心写得好累,阿西吧,神呐。。。好了,利用点自然是information_schema库。

  我们首先想获取的自然是当前库里的所有表,大家还记得吧,在0x02的地方,我曾说过information_schema库里的tables表里存着我们想要的信息,首先table_schema里存的是啥?是所有数据库名吧,那table_name里存的啥?是所有表名吧,既然如此,只需要将select database()查出来的当前库名对应一下,自然就能得到所有属于当前库的表名了哎。

  所以,我们来先正常尝试一下(额,对了跨库的话就“from 库名.表名”就行了):

  可以看到,确实获取了属于sqli库的所有表名,此时一看,哪个敏感一幕了然啊,嘿嘿,让我们猥琐的继续:

  就这么简单,通过前面那个等式,大家就能够通过这两个语句直接构造攻击的Payload了吧,嘿嘿(容我猥琐的笑会儿~~)

  0x07 注射第五步——通过已知表、列GET数据

  好了,最后,我们就能通过已知的表、列GET想要的数据了,例如:

  但是例如php程序在处理查询结果时有点坑咋办?就例如mysql_fetch_array()后只取了[0]咋办?难道一个一个查?那不累死?

  所以还是用第4篇里讲到过的group_concat()函数来解决吧,如下例:

  好了,这篇paper就到这里了,接下来还会有更多更高级的SQL注射技巧等着大家~~

本文来源:http://bbs.ichunqiu.com/thread-10222-1-1.html

[深入学习Web安全](5)详解MySQL注射的更多相关文章

  1. MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现

    一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在 ...

  2. Java Web学习总结(19)——web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  3. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  4. Activiti工作流学习之流程图应用详解

    Activiti工作流学习之流程图应用详解 1.目的  了解Activiti工作流是怎样应用流程图的. 2.环境准备2.1.相关软件及版本    jdk版本:Jdk1.7及以上 IDE:eclipse ...

  5. 详解Mysql分布式事务XA(跨数据库事务)

    详解Mysql分布式事务XA(跨数据库事务) 学习了:http://blog.csdn.net/soonfly/article/details/70677138 mysql执行XA事物的时候,mysq ...

  6. [转帖]Docker学习之Dockerfile命令详解

    Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...

  7. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  8. MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

    MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) ...

  9. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

随机推荐

  1. 轻量级前端MVVM框架avalon - 控制器

    引子: 最近工作挺忙,avalon只能断断续续的写下去了,大概看了下angular的源码,看到小一半就比较难坚持了,是块硬骨头,慢慢啃吧 不过angular的的文档中用词还是很优雅: HTML编译器 ...

  2. SQL 联合查询 + XML解析

    (select a.EBILLNO, a.EMPNAME, a.APPLYDATE, b.HS_NAME, ), ),'') as SUMMARY, cast(c.XmlData as XML).va ...

  3. (转)使用minicpan创建本地CPAN

    在临时的办公场所网络不畅,有时不能下载cpan上的软件包,所有只能自建一个cpan. 这里使用了工具'minicpan',简单地说:就是把互联网上的CPAN搬到自己的电脑里,它的最初想法来自Randa ...

  4. DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射

    写在前面 首先,这篇博文是用博客园新发布的 MarkDown编辑器 编写的,这也是我第一次使用,语法也不是很熟悉,但我觉得应该会很爽,博文后面再记录下用过的感受,这边就不多说. 阅读目录: 上一篇回顾 ...

  5. 设置SharePoint Server 2013 的匿名访问

    默认情况下,SharePoint Server 2013 是关闭匿名访问的,但是某些环境下我们又需要将这个匿名访问对全员开放,怎么操作更加安全与便捷,对于一个崭新的环境我们可以这样操作. 首先在当前需 ...

  6. vmware网卡设置详解

    转载请注明出处!本文连接及作者.不得用于商业用途! http://hi.baidu.com/quantumcloud/blog/item/9156a6c584996c179c163d5b.html B ...

  7. 深入seajs源码系列一

    简述 前端开发模块化已经是大势所趋,目前模块化的规范有很多,众所周知的有commonJS,Module/Wrappings和AMD等,而且ES6也着手开始制定模块化机制的实现.类似于c/c++的inc ...

  8. iframe编程的一些问题

    前几天做一个用iframe显示曲线图的demo,发现对iframe的contentDocument绑定 onclick事件都无效,而在页面中对iframe.contentDocument的onclic ...

  9. reflow和repaint(摘录自张鑫旭的翻译)

    //正文开始 关于回流(reflows)与重绘(repaints),我已经在twitter和delicious上发布,但是并没有在演讲中提到或是以文章形式发布. 第一次让我开始思考关于回流(reflo ...

  10. Oracle配置和使用闪回

    环境:RHEL 6.4 + Oracle 11.2.0.4 目录: 一.闪回查询 1.1 闪回查询举例 1.2 闪回版本查询举例 二.闪回事物 2.1 闪回事物查询的先决条件 2.2 闪回事物查询 三 ...