English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 业界动态 >> Mssql和Mysql的安全性分析

 

Mssql和Mysql的安全性分析

威盾防火墙 2014-11-19

 

数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业伙伴和 
客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们 
用这些数据库保存一些个人资料,还掌握着敏感的金融数据。但是数据库通常没有象 
操作系统和网络这样在安全性上受到重视。数据是企业,组织的命脉所在,因此选择 
一款安全的数据库是至关重要的。大型网站一般使用oracle或DB2,而中小型网站大 
多数使用更加灵活小巧的mssql数据库或者mysql数据库。那么,在同样的条件下,微 
软的mssql和免费的mysql哪个更加安全呢?

我在我的机子上面用管理员帐号默认安装了mssql和mysql以便在相同的情况下测 
试他们的安全性。我的系统配置如下:操作系统Microsoft Windows 2000 Version5.0, 
安装了sp4,ftp服务和iis服务,支持asp和php。系统只有一个管理员帐号admin,guest 
帐号没有禁用。


一.系统内部安全性分析


1.mysql数据库权限控制问题

mysql的权限控制是基于mysql这个数据库的,叫做授权表,一共包括包括六个表 
columns_priv,db,func,host,tables_priv和user。先使用desc user命令查看非 
常重要的user表的结构以便查询内容,现在可以查看他的权限设置了。 
使用命令select host,user,password,delete_priv,update_priv,drop_priv from user; 
这个命令查看了几个比较危险的权限,显示结果如下: 
mysql> select host,user,password,delete_priv,update_priv,drop_priv from user; 
+-----------+------+------------------+-------------+-------------+-----------+ 
| host | user | password | delete_priv | update_priv | drop_priv | 
+-----------+------+------------------+-------------+-------------+-----------+ 
| localhost | root |0e4941f53f6fa106 | Y | Y | Y | 
| % | root | | Y | Y | Y | 
| localhost | | | Y | Y | Y | 
| % | | | N | N | N | 
+-----------+------+------------------+-------------+-------------+-----------+ 
4 rows in set (0.00 sec) 
第一条表示在本机使用root用密码登陆,拥有删除记录,修改记录,删除表等权限, 
好,这是安全的。第二条表示在任何主机使用root不需密码登陆,拥有删除记录, 
修改记录,删除表等权限。第三条表示在本机匿名登陆,拥有删除记录,修改记 
录,删除表等权限。最后条表示可以再任何主机匿名登陆,但是没有任何权限。 
显然,第二,三,四都是不安全的!第二条不用说,就第三条而言,就算你在本地 
是guest权限,但是也可以登陆mysql数据库,而且拥有全部权限。这样,就可以对数 
据库为所欲为了。 
解决方法:如果你不需要远程维护,删除掉第二条,delete from user where 
host="%" and user="root";或者给它加个强壮的密码。删除第三条,delete from 
user where host="localhost" and user="";


2.mysql安装目录权限问题

mysql默认安装到c:mysql,但是c盘默认是everyone完全控制,由于权限的继承 
性,c:mysql对everyone也是完全控制的,显然这样是不安全的。因为恶意用户可以 
删除重要的数据文件。 
解决方法:重新设置mysql目录的存取权限。或者将mysql安装到其他目录,如果 
你移动Mysql分发到D:mysql,你就必须使用用 
D:mysqlinmysqld --basedir D:mysql来启动mysqld,甚至还需要修改它的配置 
文件。

3.mssql数据库权限控制问题

mssql数据库的权限控制是基于master库的syslogins表,拥有所有权限的帐号是 
sa,其他还有sysadmin,db_owner等不同权限帐号。但是,mssql数据库最高权限帐 
号sa的默认密码是空,这样如果安装的时候不注意,就会给数据带来毁灭性的灾难。 
恶意攻击者可以修改,删除所有数据,更加重要的是mssql帐号可以利用扩展执行系 
统命令。 
解决方法:定期检查所有登陆帐号,查看是否有不符合要求的密码。 
Use master 
Select name,Password from syslogins where password is null命令检查是否有空 
口令帐号存在。尽可能的删除存储扩展,防止本地用户利用存储扩展执行恶意命令。 
use master 
sp_dropextendedproc xp_cmdshell 命令删除xp_cmdshell扩展。

4.mssql安装目录权限问题

同mysql一样,mssql也是安装到everyone完全控制c盘,由于存取控制问题,最 
好安装到d盘等非系统盘进行严格的权限控制。而且,由于mssql数据库与系统结合非常紧密,系统管理员在没有数据库密码的情况下也可以通过选择windows验证来操作数据库。因此,普通用户有可能通过系统漏洞提升自己的权限,对数据库进行破坏。

解决办法:除了严格的存取限制外,还要定期查看SQL Server日志检查是否有可 
疑的登录事件发生,或者使用DOS命令findstr /C:"登录" d:Microsoft SQL ServerMSSQLLOG*.*。 
mssql的安全是和windows系统安全紧密结合的,任何一个出现漏洞,都会威胁到另一个的安全。


总结,在系统内部安全性上,mysql和mssql都没有达到令人满意的程度,帐号安全,存取权限都控制的不是很好。但是mssql有详细的日志可以查看登陆情况,比mysql要高出一筹。如果进行了合理的设置,mysql反而要更加安全些,因为对mssql而言,只要有系统权限即可拥有数据库权限。

 

二.外部网络安全性分析

 

1.数据库服务的探测

为了安全,可以让mysql服务运行在内网,但是如果你的机器有外网的接口,mysql也会自动被绑定在外网上面,暴露在internet中,而且系统会在TCP的3306端口监听,非常容易被端口扫描工具发现,不能保证数据安全。如果默认,mssql则会打开TCP的1433端口监听。虽然mssql可以人为的改变监听端口,但是通过微软未公开的1434端口的UDP探测可以很容易知道SQL Server使用的什么TCP/IP端口了。往UDP1434端口 
发送一个1个字节的内容为02的数据包,被探测的系统则会返回安装的mssql服务信息,这些信息包括:主机名称、实例名称、版本、管道名称以及使用的端口等。这个端口是微软自己使用,而且不象默认的1433端口那样可以改变,1434是不能改变的。一个典型的返回的信息如下: 
ServerName;Sky;InstanceName;sky;IsClustered;No;Version;8.00.194;tcp;3341;np;\skypipeMSSQL$XHT310sqlquery; 可以发现mssql的tcp端口改成了3341,为攻击者打开了方便之门!只要会一点socket编程知识,很容易就可以写出扫描mssql服务的程序,而且,由于利用了udp端口,一般的过滤是很难防范的。 补天的awen写了个探测程序,用的是c#语言,代码如下: 
using System; 
using System.Net.Sockets; 
using System.Net; 
using System.Text; 
using System.Threading;

namespace ConsoleApplication3 
{

class Class1 
{ 
//创建一个UDPCLIENT实例 
private static UdpClient m_Client;

//LISTEN用来获取返回的信息 
public static string Listen(string hostip) 
{ 
string HostIP = hostip; 
IPAddress thisIP = IPAddress.Parse(HostIP); 
IPEndPoint host = new IPEndPoint(thisIP,1434); 
byte [] data = m_Client.Receive(ref host); 
Encoding ASCII = Encoding.ASCII; 
String strData = ASCII.GetString(data); 
return strData;

} 
//SEND 
public static void Send(string hostip) 
{ 
string HostIP = hostip; 
byte [] buffer = {02}; 
//02为要发送的数据,只有02、03、04有回应 
int ecode = m_Client.Send(buffer,1,HostIP,1434); 
//ecode用来返回是否成功发送 
if(ecode <= 0) 
{ 
Console.WriteLine("发送时出错:" + ecode);

}

} 
//对返回的信息的简单的处理 
public static void OutputInfo(string strdata) 
{ 
string str = strdata; 
//str.le 
char [] that = {‘;‘,‘;‘}; 
string [] strofthis =str.Split(that); 
//int i= 0  
for(int i=0;i{

Console.Write(strofthis); 
Console.Write(‘
‘); 
}

} 
//输入IP 
public static string InputHostIP() 
{ 
Console.Write("enter the ip you want to scan:

"); 
string hostip =Console.ReadLine(); 
Console.Write(‘
‘); 
return hostip; 
} 
//EXIT 
public static void Exit() 
{ 
Console.WriteLine("if you want to exit ,just input 1
"); 
int a = Console.Read(); 
if(a!= 1) 
{ 
Console.WriteLine("if you want to exit ,just input 1
"); 
Console.Read(); 
} 
else 
{ 
} 
}

[STAThread]

static void Main(string[] args) 
{ 
string HostIP; 
HostIP = InputHostIP(); 
Console.WriteLine("Begin to send udp to the host"); 
m_Client = new UdpClient(); 
Send(HostIP); 
string strData=Listen(HostIP); 
OutputInfo(strData); 
Exit();

} 
} 
}

3一个典型的返回的信息

ServerName;AWEN; 
InstanceName;AWEN; 
IsClustered;No; 
Version;8.00.194; 
tcp;1044; (TCP的端口,可见就算改了端口也是很容易找到的) 
np;\AWENpipeMSSQL$XHT310sqlquery;

 


解决办法:安装防火墙,或者利用Windows 2000系统的ipsec对网络连接进行ip限制,实现IP数据包的安全性。对IP连接进行限制,只保证自己的IP能够访问


相关内容: 最新内容:
浅析php过滤html字符串,防止SQL注入的方法[2014-11-18]
Php中用PDO查询Mysql来避免SQL注入风险的方法[2014-11-18]
防止SQL注入[2014-11-18]
mysql数据库root密码忘记的修改方法[2014-11-18]
SQL注入攻击及其防范检测技术研究(2)[2014-11-16]
php中$_GET与$_POST过滤sql注入的方法[2014-11-14]
拒绝服务攻击原理及解决方法[2014-11-19]
DoS拒绝服务攻击工具基本技术及其发展方向[2014-11-19]
什么是CC攻击,与DDOS的区别[2014-11-19]
发现最新式的DDOS攻击方式[2014-11-19]
冲浪DDoS(拒绝服务)攻击的趋势与防御[2014-11-19]
密码破解速度全面披露 6位最不安全[2014-11-19]