yanweidong1030 [原作]
數據庫是電子商務、金融以及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:mysqlbinmysqld --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能夠訪問,拒絕其他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注入攻擊也非常可怕。好了,限於篇幅,這篇文章到此結束。