扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源:IT专家网 2007年11月20日
关键字:安全性 MySQL SQL Server
数据库是电子
我在我的机子上面用管理员帐号默认安装了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数据库,而且拥有全部权限。这样,就可以对数据库为所欲为了。
解决方法:如果你不需要
2.mysql安装目录权限问题
mysql默认安装到c:\mysql,但是c盘默认是everyone完全控制,由于权限的继承性,c:\mysql对everyone也是完全控制的,显然这样是不安全的。因为恶意用户可以删除重要的数据文件。
解决方法:重新设置mysql目录的存取权限。或者将mysql安装到其他目录,如果你移动Mysql分发到D:\mysql,你就必须使用用D:\mysql\bin\mysqld --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 Server\MSSQL\LOG\*.*。
mssql的安全是和windows系统安全紧密结合的,任何一个出现漏洞,都会威胁到另一个的安全。
总结,在系统内部安全性上,mysql和mssql都没有达到令人满意的程度,帐号安全,存取权限都控制的不是很好。但是mssql有详细的日志可以查看登陆情况,比mysql要高出一筹。如果进行了合理的设置,mysql反而要更加安全些,因为对mssql而言,只要有系统权限即可拥有数据库权限。
二.外部1.数据库服务的探测
为了安全,可以让mysql服务运行在内网,但是如果你的
发送一个1个字节的内容为02的数据包,被探测的系统则会返回安装的mssql服务
ServerName;Sky;InstanceName;sky;IsClustered;No;Version;8.00.194;tcp;3341;np;\\sky\pipe\MSSQL$XHT310\sql\query; 可以发现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(); } } } |
ServerName;AWEN;
InstanceName;AWEN;
IsClustered;No;
Version;8.00.194;
tcp;1044; (TCP的端口,可见就算改了端口也是很容易找到的)
np;\\AWEN\pipe\MSSQL$XHT310\sql\query;
解决办法:安装防火墙,或者利用Windows 2000系统的ipsec对网络连接进行ip限制,实现IP数据包的安全性。对IP连接进行限制,只保证自己的IP能够访问,拒绝其他IP进行的端口连接,把来自网络上的安全威胁进行有效的
2.数据库的密码探测
密码攻击包括两种,破解密码和网络监听。破解密码是使用工具不停的连接数据库来猜测密码, 包括字典攻击,暴力攻击和界于两者之间的半暴力半字典攻击。通常攻击者先采用字典攻击的方法, 没有成功的话依次采用半暴力半字典攻击,暴力攻击。在网络速度够好,
解决方法:针对密码破解,只要把密码设置为足够强壮,并且对同个ip地址不停的连接请求进行屏蔽即可。 但是对于监听来说,网络传输的时候如果不加密的话,所有的网络传输都是明文的,包括密码、数据库内容等 等,不管多么复杂的密码都是于事无补的,这是一个很大的安全威胁。所以,在条件容许情况下,最好使用SSL
来加密协议,当然,你需要一个证书来支持。并且,对于网络监听应该及时发现,如果网络中的丢包率突然提 高,那么就有理由怀疑网络遭到监听。
3.脚本安全
脚本安全本身就是个非常复杂的问题,足以写一篇专业的长篇分析文章,而且我对脚本不是很内行,mix,envymask,pskey,angel他们比较疯狂,哈哈。脚本
安全主要是对提交的数据缺乏严格的检查导致的,比较危险的符号有“;”,“ ”,“#”,“--”,“$”, “\”等。这个问题最初被认为是asp+sql server的问题,但是很快就发现实质上它的影响非常大,后来有人继续深入发现在php+mysql该问题依然会存在,san对php作过深入分析,有兴趣的去安全焦点找他的文章。对于脚本
好象没有特有效的解决方法,只有依靠程序员的个人素质了……
总结,不管是mysql,还是mssql,在外部网络中,都受到相当大的威胁。相比而言,mssql受到的威胁甚至要更大些,最近2年来,mssql暴露出了多个
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。