MySQL安全攻防实战指南之体系结构篇

来源:互联网 发布:it狂人第一季 编辑:程序博客网 时间:2024/06/04 19:37

一、MySQL支持的机器体系结构

MySQL自称是当今世界上最流行的开源数据库,并且是免费发行,同时还能运行在各种平台之上――这也正是黑客们对它趋之若鹜的原因。与其它大型数据库相比较而言,它的配置工作要容易、简单得多,并且性能也说的过去。尽管它的用法相对来说简单一些,但是在安全配置方面还是有大量的工作要做的,这也是许多数据库存在安全隐患的原因之一。

一般情况下,人们都是通过二进制文件程序包来安装MySQL数据库服务器,这时它可以安装到如下所示的系统:Linux x86、Linux IA64、Linux AMD64、Windows、Solaris、FreeBSD、Mac OS X、HP-UX、IBM AIX、QNX、Novell Netware、OpenBSD、SGI IRIX、DEC OSF;如果从源代码进行安装的话,那么它能支持的平台还要多。

二、MySQL的部署

由于MySQL服务器是如此流行,以至于在网络中的任何角落几乎都能找到它的身影,实际上,它不仅安装到专用服务器中,就连桌面机器中也常见它的踪迹。

在一般的配置中,客户端会通过TCP 3306端口连接到MySQL。对于Windows平台而言,还可以通过有名管道使用MySQL,不过一般不推荐这样配置。默认情况下,以有名管道模式运行的MySQL会同时侦听TCP 3306端口和一个名为MySQL的有名管道。与诸如Oracle之类的数据库系统相比,MySQL使用的网络协议就比较简单了,并且默认情况下是使用明文通信,当然也可以使用SSL来保护通信。启用SSL协议后,数据库仍然是一TCP 3306端口。

您可以很轻松地检测一台主机上运行的MySQL的版本,因为只要连接该机器,它就会返回数据库的主要版本号和次要版本号,某些版本还会提供操作系统的提示信息。任何能够抓取旗标的TCP端口扫描器都能够返回MySQL版本。

MySQL最普遍的应用是为动态web应用程序提供后端支持,当我们扫描网络时见到的MySQL通常出现在Apache/PHP应用程序的后端,甚至有时候它竟跟web服务器运行在同一台主机上。在一些大型组织中,它常用作日志记录服务器,用于存放入侵检测系统日志、web日志或者其他审计任务。有些情况下,特别是在开发环境中,MySQL经常被安装到一台桌面机器上,所以在PC上扫描到它也就不足为奇了。

由于MySQL通信协议是明文通信,因此人们喜欢在MySQL服务器所在主机上同时安装一个SSH服务器,并使用端口转发技术通过加密隧道连接至3306端口。这种方法有几种好处:数据在运输中是加密的,并强迫执行一个额外的认证步骤,同时还给该数据库的连接提供了额外的审计记录。

此外,有人认为MySQL服务器应该与web服务器安装到同一台机器上,因为这样可以避免远程连接,但是这种配置本身就是不安全的。之所以这样说,是因为MySQL的数据表是以文件的形式存储的,并且通常没有锁定,那么一旦Web应用程序出现文件泄露漏洞,这就使得攻击者能够下载数据库的所有内容。从另一方面来说,Web应用程序中的SQL注入漏洞也可能导致攻击者得以修改web服务器上的脚本内容。恰当的文件权限可以防止此类问题,但是除此之外,将web服务器和数据库服务器置于同一台机器上还为攻击者敞开了许多其它的方便之门。

三、WinMySQLAdmin简介

当MySQL安装到Windows平台的时候,通常会提供WinMySQLAdmin工具。当这个工具第一次运行时,它会将自身添加到运行它的用户所在的启动组。当它运行时,WinMySQLAdmin会自动地启动MySQL,这会导致运行于Windows主机的MySQL的实例在无意间被运行。

此外,当WinMySQLAdmin运行于没有默认MySQL用户帐户的主机时,它会要求用户创建一个用户名和口令对,并将这些凭证以明文形式存储在系统根目录(例如,c:winnt)下的my.ini文件中。这个文件通常对该主机上的任何用户来说都是可读的。

四、缺省用户名和口令

MySQL的默认配置随平台、部署模式、发行版本(源代码或者二进制文件)和初始配置的不同而异,在有些情况下MySQL服务器一经安装就可能被远程攻击者所攻陷――如果缺省配置有问题的话。举例来说,MySQL 4.0.20的一些默认配置下,表mysql.user中有四条缺省记录,有两条用于root帐户,另两条用于匿名帐户。并且,有一个带有root权限的远程表项是给主机build上的根用户的。这些表中的表项的具体含义,我们会在后面加以详解,现在我们只需知道的是:

如果您位于本地主机,那么您可以作为密码为空的root根用户通过身份验证,并获得数据库的完全控制权。如果您位于本地主机,您可以使用任何用户名通过身份验证,并获得对该数据库的来宾访问权限。如果您位于一个远程主机上,同时能够控制服务器的名称解析,这样的话就可以使你的主机名看起来是“build”,所以您就可以作为密码为空的root用户通过身份验证,从而获得数据库的完全控制权。如果您位于一台名为build的远程主机上,那么您就可以使用任何用户名来通过身份验证,并获得数据库的来宾访问权限。

在Windows主机上,根帐户的存在会导致任何本地用户都能将自身权限提升为本地系统级访问权限;而在默认情形下,MySQL就是运行在系统权限级别的。糟糕的是,攻击者只需简单将其机器命名为build,那么他就轻而易举地获得了对运行MySQL服务的机器的远程系统级访问权限。当然,攻击者必须位于目标所在的同一个NetBIOS名字域中,或者能够伪造一个DNS响应。针对这一问题的防御方法是:

安装MySQL时禁用网络连接。
安装之后立即删除mysql.user表中除本地主机root帐户之外的全部帐户。
为本地主机root帐户设置一个复杂的密码。
五、身份验证协议中的安全漏洞

MySQL使用一个专有协议进行身份验证和发送接收数据。这个协议比较简单,所以可以为MySQL轻松编写一个定制的客户端。换句话说,MySQL身份验证协议的各版本中的严重漏洞可能会导致服务器立即被攻陷。下面我们介绍之前发现的一些漏洞,以及针对这些漏洞的攻击方法。

描述这些攻击方法之前,我们先来大致介绍涉及身份验证协议的包格式和加密机制。当客户端连接服务器时,服务器问候数据包,其中包含下列域:

Packet Length (3 bytes)
Packet Number (1 byte)
Protocol Version (1 byte)
Server Version String (以null结尾)
Server Thread ID (4 bytes)
Challenge String (以null结尾)
Server Capabilities Flags (2 bytes)
Server Character Set (1 byte)
Server Status (2 bytes)
Padding (数据包的其余部分)
就身份验证协议而言,有关的内容是Protocol Version和Challenge域,但是Server Version String域则对确定服务器容易受到哪些身份验证漏洞的攻击非常有帮助。客户端然后会发送一个身份验证数据包给服务器:

Packet Length (3 bytes)
Packet Number (1 byte)
Client Capabilities (2 bytes)
Max packet size (3 bytes)
Username (以null结尾)
Password (challenge响应以null结尾)
下面我们对身份验证协议中的安全漏洞进行介绍。MySQL身份验证协议中已经发现过许多安全漏洞,我们这里略举一二。

身份验证协议4.1版本之前的基本密码弱点

4.1版本之前的MySQL,无需知道密码,只要知道密码的hash值(包含在mysql.user表中)就能通过身份验证――这意味着,攻击者根本无需编写密码杂凑值的破解程序,因为修改标准MySQL客户端让它接受密码杂凑而非密码要容易多了。当然,用户倾向于多处使用同一个密码,尤其是root密码,所以破解任何一个密码的杂凑值,就极有可能在多个地方派上用场。

3.23.11版本之前的身份验证算法

3.23.11版本之前的MySQL的身份验证机制中有一个严重的缺陷,即攻击者仅仅使用杂凑后的密码的单个字符就能通过身份验证。其实杂凑后的字符串由32个字符中的某些字符构成的,所以攻击者只需进行少量猜测就能登录。

3.23.54版本之前的CHANGE_USER

对于3.23.54版本之前的MySQL来说,如果用户可以进行身份验证,它就有机会提交一个超长字符串(来触发缓冲区溢出)或者单字节字符串的CHANGE_USER命令来提权。

4.1.1、4.1.2和5.0.0版本中的身份验证算法

通过提交一个精心制作的身份验证数据分组,对于攻击者而言,就有可能绕过在4.1.0到4.1.2以及5.0早期构建版的MySQL中的密码身份验证机制。下面的代码取自sql_parse.cpp文件的check_connection代码:

/*

旧版本的客户端发送以null结束的字符串作为密码;新客户端使用尺寸(1字节)+字符串(并非以null作为终止符)作为密码。 因此如果是空密码的话,两者都会发送

0 0
原创粉丝点击