二.外部网络安全性分析
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;\\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();
}
}
}
3一个典型的返回的信息
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进行的端口连接,把来自网络上的安全威胁进行有效的控制。重要的是,还要对端口作过滤,包括大部分的tcp和udp端口,因为仅仅做ip限制的话,有可能恶意攻击者先攻击被数据库服务器信任的主机,控制之后作为跳板对数据库服务器进行攻击。
2.数据库的密码探测
密码攻击包括两种,破解密码和网络监听。破解密码是使用工具不停的连接数据库来猜测密码, 包括字典攻击,暴力攻击和界于两者之间的半暴力半字典攻击。通常攻击者先采用字典攻击的方法, 没有成功的话依次采用半暴力半字典攻击,暴力攻击。在网络速度够好,电脑运算能力够强的情况下,这 样的密码攻击危害是相当大的。网络监听则是控制一台网络设备,在上面运行监听工具捕获在网络中 传送的密码信息。网络监听可以分为两种,一种是外部的监听,将侦听工具软件放到网络连接的设备或者 放到可以控制网络连接设备的电脑上,这里的网络连接设备,比如网关服务器,比如路由器等等。另外一 种是来自内部的监听,对于不安全的局域网,数据是采用广播的方式传播的,只要把网卡设置为混杂模式即可接收到本来不属于自己的数据包,当然可能包括密码信息等资料。
解决方法:针对密码破解,只要把密码设置为足够强壮,并且对同个ip地址不停的连接请求进行屏蔽即可。 但是对于监听来说,网络传输的时候如果不加密的话,所有的网络传输都是明文的,包括密码、数据库内容等 等,不管多么复杂的密码都是于事无补的,这是一个很大的安全威胁。所以,在条件容许情况下,最好使用ssl来加密协议,当然,你需要一个证书来支持。并且,对于网络监听应该及时发现,如果网络中的丢包率突然提 高,那么就有理由怀疑网络遭到监听。
3.脚本安全
脚本安全本身就是个非常复杂的问题,足以写一篇专业的长篇分析文章,而且我对脚本不是很内行,mix,envymask,pskey,angel他们比较疯狂,哈哈。脚本安全主要是对提交的数据缺乏严格的检查导致的,比较危险的符号有“;”,“ ”,“#”,“--”,“$”, “\”等。这个问题最初被认为是asp+sql server的问题,但是很快就发现实质上它的影响非常大,后来有人继续深入发现在php+mysql该问题依然会存在,san对php作过深入分析,有兴趣的去安全焦点找他的文章。对于脚本好象没有特有效的解决方法,只有依靠程序员的个人素质了……
总结
不管是mysql,还是mssql,在外部网络中,都受到相当大的威胁。相比而言,mssql受到的威胁甚至要更大些,最近2年来,mssql暴露出了多个远程溢出漏洞。如果配置的比较好的话,我认为,mysql要比mssql安全一些,因为随时会爆发的新溢出漏洞是防不胜防的,而且能够执行系统命令的sql注入攻击也非常可怕。好了,限于篇幅,这篇文章到此结束。
| Windows Server2003 防木马权限设 | 04-06 | |
| PHP开发安全浅谈 | 01-23 | |
| 防范Serv-U漏洞 | 01-16 | |
| WEB专用服务器的安全设置的实战技 | 12-30 | |
| 重燃你的PHP安全之火 | 12-04 | |
| Web服务攻击痕迹检测 | 11-28 | |
| 脚本攻击防范策略完全篇 | 11-02 | |
| 脚本攻击防范策略完全篇 | 10-28 | |
| 拒绝肉鸡之上兴远程控制的发现与 | 10-26 | |
| 拒绝肉鸡之灰鸽子的发现与清除 | 10-24 | |
| 力克旁注 巧绑域名防范whois查询 | 10-21 | |
| 系统敏感端口真正的关闭大法 | 10-01 | |